Flux audio en direct à l'aide de FFMPEG


13

J'essaie de diffuser de l'audio en direct à l'aide ffmpegd'un microphone USB externe. J'ai suivi ce tutoriel presque

J'ai dû adapter certaines étapes mais finalement, j'ai réussi à recevoir le flux de mon ordinateur portable en utilisant cette commande:

ffmpeg -f oss -i /dev/dsp1 -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp://192.168.28.116:1234

Le CPU est proche de 100%, j'ai un mauvais son pendant deux secondes et après rien ... Je vois dans Wireshark que la carte envoie des trames en continu.

Quelqu'un a-t-il des idées pour réduire l'utilisation du processeur?


Vous voudrez peut-être examiner l'overclocking et une répartition de mémoire différente. Si vous avez le choix du codec, vous pourrez peut-être obtenir des améliorations en changeant. Vous pouvez également étudier la compression du flux - bien que cela puisse être un gain nul - tout ce que vous gagnez en temps de transfert peut être perdu lors de la compression.
Steve Robillard

Avez-vous d'abord essayé d'écrire dans un fichier local? J'essaierais d'aller étape par étape: 1) enregistrement en temps réel sur un fichier wave, 2) enregistrement en temps réel sur un fichier mp3 3) streaming de trucs sur le réseau
pixelistik

pas pour le moment. semble être compliqué de faire toutes ces étapes manuellement au lieu de ffmpeg entièrement automatique ;-)
hotips

Qu'enregistrez-vous?
Alex Chamberlain

Réponses:


7

Pour répondre à votre question spécifique, vous pouvez réduire le processeur en canalisant un enregistrement dans ffmpeg:

arecord -f cd -D plughw:1,0 | ffmpeg -i - -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp://234.5.5.5:1234

Vous devrez remplacer plughw: 1,0 par votre carte son spécifique. Voir arecord -l pour plus d'informations. Sur mon Rasp Pi, il est passé de ~ 95% CPU à ~ 35%.


6

Entrée ALSA

Une alternative est de passer par ALSA. Une commande similaire à celle ci-dessus serait

ffmpeg -ac 1 -f alsa -i hw:0,0 -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp://localhost:1234

Je ne sais pas comment cela affectera l'utilisation du processeur.


J'ai essayé: ffmpeg -ac 1 -f alsa -i hw: 1,0 -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp: //192.168.1.116: 1234 Mais ffmpeg se bloque après quelques secondes: [alsa @ 0x7a1510] Xrun du tampon ALSA. D'autres idées?
hotips

J'ai testé ffmpeg -f oss -i / dev / dsp1 -ab 32k -ac 1 -re -f rtp rtp: //192.168.28.116: 1234 mais le son est très mauvais ... le décalage est d'environ 6 secondes. Une idée pour avoir une meilleure solution?
hotips

1
@ si2w Je pense que 32k pour mp3 est un peu une blague. Soit ça, soit essayez un autre codec. Peut-être l'une des séries G2xx conçues pour les téléphones
Alex Chamberlain

3

Cela fonctionne et réduit l'utilisation du processeur:

ffmpeg -f alsa -i default:CARD=U0x46d0x819 -acodec mp2 -ac 1 -re -f rtp rtp://234.5.5.5:1234 2> /tmp/mylog.log &

Assurez-vous de remplacer la valeur par défaut: CARD = U0x46d0x819 avec votre ID de microphone (obtenu à partir de arecord -l) ou vous pouvez spécifier -i hw:0,0(ou quel que soit le périphérique).

J'ai eu un problème similaire - l'encodage mp3 a pris plus de 90% de la puissance du processeur et ne pouvait tout simplement pas suivre le son - alors je l'ai changé en encodage mp2. Cela a utilisé environ 15 à 18% du CPU (vi mesuré top) et est diffusé en douceur vers VLC sur mon LAN. Cela ferait un babyphone parfait, ou autre chose. Il y a juste une seconde ou deux délais, qui est la mise en mémoire tampon à la fin de VLC.

Remarque: l' adresse IP est une adresse de multidiffusion ([224-239] .xyz). Vous n'avez pas à le viser sur un périphérique réseau particulier de votre réseau local et votre routeur à large bande gardera le trafic local (par défaut).


2

Vous pouvez réduire considérablement la charge du processeur en réduisant la fréquence d'échantillonnage audio du périphérique d'entrée ( -ar 8000 avant -f alsa ) et en définissant le débit binaire audio du codec sur 128k ( -b:a 128k). Ironiquement, la réduction du nombre de canaux ( -ac 1) semblait augmenter la charge du processeur, j'ai donc trouvé que cette commande s'exécute sur un processeur assez faible:

ffmpeg -ar 8000 -f alsa -i hw:0 -acodec mp2 -b:a 128k -f rtp rtp://other:4444

Bien que l'on doive se rappeler que cela dépend aussi des capacités du matériel de capture que l'on essaie d'utiliser et des versions de ffmpeg / avconv.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.