Live-Audiostream mit FFMPEG

13

Ich versuche, Live-Audio über ein ffmpegexternes USB-Mikrofon zu streamen . Ich habe dieses Tutorial beinahe befolgt

Ich musste einige Schritte anpassen, aber schließlich gelang es mir, den Stream mit folgendem Befehl von meinem Laptop zu empfangen:

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

Die CPU ist fast zu 100% ausgelastet, ich habe zwei Sekunden lang einen schlechten Sound und nach nichts ... Ich sehe in Wireshark, dass das Board kontinuierlich Frames sendet.

Hat jemand Ideen, um die CPU-Auslastung zu senken?

Hotips
quelle
Vielleicht möchten Sie sich mit Übertakten und einer anderen Speicheraufteilung befassen. Wenn Sie die Wahl des Codecs haben, können Sie möglicherweise durch Umschalten eine gewisse Verbesserung erzielen. Möglicherweise möchten Sie auch die Komprimierung des Streams untersuchen - obwohl dies eine Verstärkung von Null sein kann -, kann alles, was Sie in der Übertragungszeit gewinnen, bei der Komprimierung verloren gehen.
Steve Robillard
Haben Sie zuerst versucht, in eine lokale Datei zu schreiben? Ich würde versuchen, Schritt für Schritt
voranzukommen
nicht im Moment. es scheint kompliziert zu sein, alle schritte manuell zu machen anstatt vollautomatisch ffmpeg ;-)
hotips
Was nimmst du auf?
Alex Chamberlain
1
Ich versuche, ein Ethernet-Babyphone zu machen
hotips

Antworten:

7

Um Ihre spezielle Frage zu beantworten, können Sie die CPU reduzieren, indem Sie den Befehl arecord in ffmpeg leiten:

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

Sie müssen plughw: 1,0 durch Ihre spezifische Soundkarte ersetzen. Informationen finden Sie unter arecord -l. Auf meinem Rasp Pi ging es von ~ 95% CPU auf ~ 35%.

kumar303
quelle
6

ALSA-Eingang

Eine Alternative ist, über ALSA zu gehen. Ein ähnlicher Befehl wie oben wäre

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

Ich bin nicht sicher, wie sich dies auf die CPU-Auslastung auswirkt.

Alex Chamberlain
quelle
Ich habe versucht: ffmpeg -ac 1 -f alsa -i hw: 1,0 -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp: //192.168.1.116: 1234 Aber ffmpeg stürzt nach einigen Sekunden ab: [alsa @ 0x7a1510] ALSA-Puffer xrun. Irgendwelche anderen Ideen?
Hotips
Ich habe ffmpeg -foss -i / dev / dsp1 -ab 32k -ac 1 -re -f rtp rtp: //192.168.28.116: 1234 getestet, aber der Sound ist sehr schlecht ... die Verzögerung beträgt ungefähr 6 Sekunden. Irgendeine Idee, eine bessere Lösung zu haben?
Hotips
1
@ si2w Ich denke, 32k für MP3 ist ein bisschen ein Witz. Entweder auf die Beine stellen oder einen anderen Codec ausprobieren. Vielleicht eine der G2xx-Serien für Telefone
Alex Chamberlain
3

Dies funktioniert und reduziert die CPU-Auslastung:

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

Achten Sie darauf, die Standardeinstellung zu ersetzen: CARD = U0x46d0x819 durch Ihre Mikrofon-ID (erhalten von arecord -l) oder von Ihnen angegeben -i hw:0,0(oder von welchem ​​Gerät auch immer).

Ich hatte ein ähnliches Problem: Die MP3-Kodierung beanspruchte über 90% der CPU-Leistung und konnte mit dem Audio nicht mithalten. Deshalb habe ich sie auf die MP3-Kodierung umgestellt. Dies verbrauchte ungefähr 15-18% der CPU (gemessen vi top) und strömt reibungslos zu VLC in meinem LAN. Es wäre ein perfekter Babyphone oder was auch immer. Es gibt nur etwa eine Sekunde Verzögerung, die die Pufferung am VLC-Ende ist.

Hinweis: Die IP-Adresse ist eine Multicast-Adresse ([224-239] .xyz). Sie müssen es nicht auf ein bestimmtes Netzwerkgerät in Ihrem LAN richten, und Ihr Breitbandrouter hält den Datenverkehr lokal (standardmäßig).

tim
quelle
2

Sie können die CPU-Auslastung erheblich reduzieren, indem Sie die Audio-Abtastrate des Eingabegeräts ( -ar 8000 vorher -f alsa ) und die Codec-Audio-Bitrate auf 128k ( -b:a 128k) einstellen . Auch die ironische Reduzierung der Anzahl der Kanäle ( -ac 1) schien die CPU-Auslastung zu erhöhen, so dass ich festgestellt habe, dass dieser Befehl mit ziemlich niedriger CPU ausgeführt wird:

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

Man muss jedoch bedenken, dass dies auch von den Fähigkeiten der Capture-Hardware und den Versionen von ffmpeg / avconv abhängt.

Pierz
quelle