[LINUX] Modifier et installer la source ReadyMedia

Aperçu

J'utilise DLNA depuis quelques années avec ReadyMedia installé sur mon Raspberry Pi. J'ai eu un problème après un long moment et j'ai corrigé la source, donc J'écrirai un article de l'installation.

emballer

Environnement de construction (référence)

procédure

Procédure (1) Construisez et installez ReadyMedia

Procédure (1-1) Installation de la bibliothèque

shell


# libjpeg-turbo
yum list libjpeg-turbo libjpeg-turbo-devel libjpeg-turbo-static libjpeg-turbo-utils
yum install libjpeg-turbo libjpeg-turbo-devel libjpeg-turbo-static libjpeg-turbo-utils

# sqlite3
yum list sqlite-devel
yum install sqlite-devel

# libexif
yum list libexif libexif-devel libexif-doc
yum install libexif libexif-devel libexif-doc

# libid3tag
yum list libid3tag libid3tag-devel
yum install libid3tag libid3tag-devel

#flac
yum list flac flac-devel flac-libs
yum install flac flac-devel flac-libs

De plus, s'il y a une pénurie, installez-le comme il convient.

Procédure (1-2) Téléchargez et extrayez la source ReadyMedia

shell


cd /usr/local/src
wget http://jaist.dl.sourceforge.net/project/minidlna/minidlna/1.2.1/minidlna-1.2.1.tar.gz
tar zxvf minidlna-1.2.1.tar.gz
cd minidlna-1.2.1

Étape (1-3) Modification de la source ReadyMedia

Procédure (1-3-1) Modifier la taille du cache de la pochette d'album

Par défaut, le maximum est de 160 pixels, ce qui rend l'affichage rugueux pendant la lecture. Augmentez le maximum à 500px. (Si vous voulez être plus grand, agrandissez-le.)

2 fichiers à modifier.

shell


vi /usr/local/src/minidlna-1.2.1/albumart.c

Par 72 lignes. Réécrivez 160 à 500.

albumart.c


if( imsrc->width > imsrc->height )
{
	# dstw = 160;
	dstw = 500;
	# dsth = (imsrc->height<<8) / ((imsrc->width<<8)/160);
	dsth = (imsrc->height<<8) / ((imsrc->width<<8)/500);
}
else
{
	# dstw = (imsrc->width<<8) / ((imsrc->height<<8)/160);
	dstw = (imsrc->width<<8) / ((imsrc->height<<8)/500);
	# dsth = 160;
	dsth = 500;
}

shell


vi /usr/local/src/minidlna-1.2.1/metadata.c

Par 594 lignes

metadata.c


if( ed->size )
{
	/* We might need to verify that the thumbnail is 160x160 or smaller */
	if( ed->size > 12000 )
	{
		imsrc = image_new_from_jpeg(NULL, 0, ed->data, ed->size, 1, ROTATE_NONE);
		if( imsrc )
		{
			#if( (imsrc->width <= 160) && (imsrc->height <= 160) )
			if( (imsrc->width <= 500) && (imsrc->height <= 500) )
				thumb = 1;
			image_free(imsrc);
		}
	}
	else
		thumb = 1;
}

Procédure (1-3-2) Modifier la logique de collecte des informations ARTIST

Si vous conservez la valeur par défaut, si la chanson a un ensemble d'artistes d'album, celui-ci sera prioritaire. En termes de logique   [ALBUM ARTIST] > [BAND] > [ARTIST] Ainsi, il semble que seuls les attributs ARTIST sont gérés dans la base de données, et ceux qui ont une priorité élevée sont enregistrés.

Je ne sais pas pourquoi, mais c'est très gênant d'écraser l'artiste du morceau avec l'artiste du CD, donc je n'utiliserai qu'ARTIST. En termes de traitement, après avoir pris [ARTIST], il est écrasé par [ALBUM ARTIST] ou [BAND], donc Mettez en commentaire la partie où les informations sont écrasées pour éliminer le processus.

shell


vi /usr/local/src/minidlna-1.2.1/metadata.c

Par 411 lignes. Commentez le bloc entier de l'instruction if.

metadata.c


/* If there is a album artist or band associated with the album,
   use it for virtual containers. */
//if( i < ROLE_ALBUMARTIST )
//{
//	for( i = ROLE_ALBUMARTIST; i <= ROLE_BAND; i++ )
//	{
//		if( song.contributor[i] && *song.contributor[i] )
//			break;
//	}
//	if( i <= ROLE_BAND )
//	{
//		m.artist = trim(song.contributor[i]);
//		if( strlen(m.artist) > 48 )
//		{
//			m.artist = strdup("Various Artists");
//			free_flags |= FLAG_ARTIST;
//		}
//		else if( (esc_tag = escape_tag(m.artist, 0)) )
//		{
//			m.artist = esc_tag;
//			free_flags |= FLAG_ARTIST;
//		}
//	}
//}

Procédure (1-4) Construire et installer ReadyMedia

shell


./configure
make -j2
make install

Étape (1-5) Paramètres ReadyMedia

Par défaut, le tri n'est pas lié aux dossiers multimédias, définissez-le également.

shell


cp /usr/local/src/minidlna-1.2.1/minidlna.conf /etc/
vi /etc/minidlna.conf

/etc/minidlna.conf


#Définir le dossier multimédia
media_dir=Chemin arbitraire

#Entrez le nom du serveur DLNA
friendly_name=N'importe quel nom

#Trier les paramètres de spécification. Décommenter
force_sort_criteria=+upnp:class,+upnp:originalTrackNumber,+dc:title

Procédure (2) Paramètres d'exécution du service

Étape (2-1) Création d'un utilisateur d'exécution et création d'un dossier cache

useradd -s /sbin/nologin upnp
mkdir -R /var/cache/minidlna
chown -R upnp:upnp /var/cache/minidlna

Étape (2-2) Création d'une unité pour le service

shell


touch /etc/systemd/system/minidlna.service
vi /etc/systemd/system/minidlna.service

/etc/systemd/system/minidlna.service


[Unit]
Description=minidlna server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
User=upnp
Group=upnp
Restart=always
RestartSec=10
ExecStart=/usr/local/sbin/minidlnad -R -d -f /etc/minidlna.conf
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target

Étape (2-3) Activer / exécuter pour le service

shell


#Activation du service
systemctl enable minidlna.service
#Début du service
systemctl start minidlna.service
#Vérification du journal
journalctl -f -u minidlna.service

Étape (3) Confirmation

Vérifiez auprès du client DLNA. (Sous Windows, le seul client DLNA décent semble être Media Monkey.)

Étape (9) Bonus

modifier la limite de surveillance inotify

ReadyMedia utilise inotify Bien qu'il soit automatiquement ajouté lorsqu'une modification du système de fichiers est détectée. Réglez inotify si nécessaire.

shell


#Vérifiez le nombre maximum de moniteurs par utilisateur
cat /proc/sys/fs/inotify/max_user_watches

#Modifier le nombre maximum de moniteurs par utilisateur(Temporaire)
sysctl fs.inotify.max_user_watches=100000

#Modifier le nombre maximum de moniteurs par utilisateur(permanent)
touch /etc/sysctl.d/90-inotify.conf
vi /etc/sysctl.d/90-inotify.conf

conf:/etc/sysctl.d/90-inotify.conf


#Définir le nombre maximum de moniteurs par utilisateur
fs.inotify.max_user_watches = 100000

Impressions

J'essaye et me trompe depuis quelques années en écoutant des médias domestiques à l'intérieur et à l'extérieur. J'ai essayé DLNA (ReadyMedia), BubbleUPnP, SubSonic (lms), etc. ReadyMedia apprécie la disponibilité des listes de lecture placées sur le système de fichiers. C'est très utile pour la lecture BGM même à l'intérieur.

Aussi, j'ai acheté près de 600 chansons l'autre jour, donc Quand je les ai écoutés et que j'ai pensé à me souvenir des titres des chansons, j'ai pensé que les informations d'identification étaient également très importantes. Je suis content que l'affichage du nom de l'artiste puisse être corrigé cette fois. (Parce que je travaille dur pour organiser les balises ...)

photo.jpg (Référence) Amazon Kindle + BubbleUPnP

De côté

À part: Lisez lentement la logique de redimensionnement

metadata.c


if( imsrc->width > imsrc->height )
{
	dstw = 160;
	dsth = (imsrc->height<<8) / ((imsrc->width<<8)/160);
}
else
{
	dstw = (imsrc->width<<8) / ((imsrc->height<<8)/160);
	dsth = 160;
}

Le lieu de cette correction. Je pensais que la taille après redimensionnement était calculée par l'atmosphère, C'était difficile à comprendre et j'ai abandonné la lecture. Cependant, si vous y réfléchissez lentement, cela reste un peu de code intéressant.

Probablement parce qu'il n'y a pas de base particulière pour que le coefficient augmente la valeur. Si c'est le cas, je pense qu'il serait plus rapide d'accélérer par le calcul des équipes plutôt que par la multiplication. Même si vous n'utilisez normalement pas de fractions, il semble que vous envisagez FPU.

python


height' = \frac{height\times 256}{(width \times 256) \div taille désirée}

Non, c'est un niveau arithmétique, donc je n'ai pas à le décomposer jusqu'à ce point. Même lorsque je faisais une i-appli, je ne pouvais pas utiliser de fractions, telles que les jauges HP et les barres de défilement. Je me sentais nostalgique car le calcul du côté entier était courant.

En plus (2) Arithmétique qui optimise l'expression logique de redimensionnement

J'avais l'habitude de calculer le ratio pendant le processus de redimensionnement, En fait, j'ai l'expérience de pouvoir effectuer de l'arithmétique entière sans calcul de rapport en faisant d'abord la multiplication. Eh bien, dans mon cas, c'était juste un imbécile, donc il m'a fallu plusieurs années pour le remarquer (explosion). (Je cherchais un pourcentage ...) J'ai essayé un peu dur de calculer s'il pouvait être optimisé.

python


\begin{align}
height' &= \frac{height \times 256}{(width \times 256) \div taille désirée} \\
&= \frac{height}{width \div taille désirée} \\
&= \frac{height}{width \times \frac{1}{Taille souhaitée}} \\
&= \frac{height}{width} \times \frac{Taille souhaitée}{1} \\
&= (height \div width) \fois la taille désirée\\
&= height \fois la taille désirée\div width \\
\end{align}

Voilà pourquoi

python


height' = height \fois la taille désirée\div width \\

Peux tu aller : en pensant: Allons vérifier! SS.png Je l'ai vérifié avec Excel, mais cela semble correct. (Au point où le déficit est calculé, vérifiez le montant par l'erreur du ratio ass avant et après le redimensionnement.) Il y a un risque de débordement de chiffres, mais parfois la formule devient simple, alors Il peut y avoir une révision de la formule de calcul sous ces restrictions.

Référence (merci)

Recommended Posts

Modifier et installer la source ReadyMedia
Installez pyenv et pyenv-virtualenv
Installez Python et Flask (Windows 10)
Installez Python 3.7 et Django 3.0 (CentOS)
Installez Pyethapp et créez un compte
Installez Python 2.7.9 et Python 3.4.x avec pip.
Installez Mecab et mecab-python3 sur Ubuntu 14.04
Comment installer et utiliser Tesseract-OCR
Installez et exécutez Dropbox sur Ubuntu 20.04
Installez OpenCV et Chainer sur Ubuntu
Installez CUDA 8.0 et Chainer sur Ubuntu 16.04
Construisez et installez OpenCV sur Windows
Comment installer et configurer Blackbird
Comment installer et utiliser Graphviz
Installez le fabric sur Ubuntu et essayez
Compilez et installez Git à partir des sources.
Playbook Ansible pour installer et configurer `pyenv`
Installez easy_install et pip sur Windows
Jusqu'à ce que matplotlib soit installé et exécuté