Wie kann ich mit ffmpeg Video und Sound gleichzeitig aufnehmen?

cabriofahrer

Well-Known Member
Soweit ich weiß, kann man mit ffmpeg mehrere Eingangsquellen angeben, um eine Output Datei zu erstellen. Ich habe eine kleine USB Webcam, die auch über ein eingebautes Micro verfügt. Wenn ich

Code:
ffmpeg -i /dev/video0 test.mpg

eingebe, bekomme ich tatsächlich eine Videodatei. Soweit, so gut. Doch wie integriere ich beim Aufnehmen den Ton? Ich nehme an, das Micro muss auch einem "dsp" zugewiesen sein. Doch welchen hat es? Die Ausgabe von "ls /dev":

Code:
$ ls /dev | grep dsp
dsp0.0
dsp1.0
dsp2.0
dsp3.0
dsp4.0
dsp5.0
dsp6.0
dsp7.0
$

Das in die Webcam eingebaute Micro ist offenbar "uaudio0":

Code:
uaudio0 on uhub5
uaudio0: <AudioDevice> on usbus7
uaudio0: No playback.
uaudio0: Record[0]: 48000 Hz, 1 ch, 16-bit S-LE PCM format, 2x8ms buffer.
uaudio0: Record[0]: 16000 Hz, 1 ch, 16-bit S-LE PCM format, 2x8ms buffer.
uaudio0: No MIDI sequencer.
pcm7: <USB audio> on uaudio0
pcm7: Mixer "mic":
uaudio0: No HID volume keys found.

Und wie wäre dann die komplette Syntax für ffmpeg? Braucht man da für jede Input Quelle jeweils den Parameter "-i" oder nur einmal?
 
Soweit ich das weiß gibst du alle input Quellen mit -i an. Wie dein Audio-Device dann heißt kann ich dir allerdings auch nicht helfen.
 
Den jail-Teil mal ignoriert und bei FreeBSD OSS statts ALSA im Hinterkopf, sollte man damit ein gutes Stück weiter kommen.

Ein Besonderheit gibts bei manchen USB-Cams, (nur Logitech?). Die wollen einmal angetriggert werden, damit das Mikrofon zugänglich ist. Ob das dann ein Problem mit ffmpeg wird, weiß ich nicht, muss man mal rumspielen:
The built-in microphone of newer Logitech webcams works with snd_uaudio(4) (tested with C160, C210, C270 HD and C310 HD), but it requires the following command after an application (e.g. pwcview or skype) has opened the camera device (/dev/video0) for the first time:

  • usbconfig -d ugenX.Y do_request 0x22 0x01 0x100 0x86 0x03 0x80 0xBB 0x00
Replace "ugenX.Y" with your device, according to the output from "usbconfig" or "dmesg". You have to issue that command only once; it remains in effect until you unplug the camera. You can use the following command to test the microphone:

  • dd if=/dev/dspX.0 of=/dev/dspY.0 bs=64
Where "X" is the pcm number of the microphone, and "Y" is the pcm number of your normal playback device (speakers). The command "cat /dev/sndstat" lists all devices and their numbers.

Mit vlc solltest du alle devices durchtesten können, bis du beim Mikro angelangt bist, aber pass mit der Rückkopplung auf bzw. temporär Kopfhörer dabei benutzen. Auch kann man mit vlc direkt aufnehmen, da braucht man aber genaue Kenntnis über die Kamera, was die an videomodi anbietet, sonst zickt das gerne oder vlc crasht. Falls du nur Bild aus der webcam bekommst und audio gar nicht gangbar zu kriegen ist, kann man immer noch ein externes Mikrofon mit 3,5er Klinke oder das eingebaute am Laptop verwenden.
 
Als ergänzung - die Software OBS bietet ein ziemlich cooles gui um aufnahmen aller art zu erstellen und scheint es wenn ich das richtig sehe auch für FreeBSD zu geben.
 
Zu dem Thema hatte ich einen erschöpfenden BLog-Artikel verfaßt:
Guter Artikel!

Zu
Apple’s Abspielsysteme können mit HEVC-MP4-Dateien nur etwas anfangen, wenn die Video-Spur das Etikett (tag) hvc1 trägt.
und
Nur die modernen Browser unterstützen H.265, für ältere Browser muß man auch H264 anbieten. Ausserdem kommt derzeit kein Browser unter macOS mit dem RGB-Farbraum (24bit/Pixel) des soeben erzeugten Videos klar, und vor der Veröffentlichung muß der Farbraum auf YUV420p (12bit/Pixel) reduziert werden.
kam mir in den Sinn, inwieweit der verwendete Container Einfluss nimmt. Du nimmst ja im Beispiel .mp4, ich werfe mal .webm und .mkv in den Ring.
mkv nehme ich immer als Archivcontainer, zum einen wegen des geringeren overheads und der Flexibilität, dass man alles reinstopfen kann. Zu Streamingfunktionalität und ob webm auch alles akzeptiert, kann ich aber nichts sagen.
Nur mal ein Gedankeneinwurf, wollte den Thread nicht kapern. ;)
 
OBS ist eigentlich genau das, was ich gesucht hatte. Trotzdem würde ich auch die Methode mit ffmpeg ausprobieren. Ich habe ein externes Mikrophon eingesteckt und mein dsp ist m.E. 4. Aber warum funktioniert der Befehl

Code:
ffmpeg -i /dev/video0 -i /dev/dsp4 test2.mpg

nicht?
 
OBS ist eigentlich genau das, was ich gesucht hatte. Trotzdem würde ich auch die Methode mit ffmpeg ausprobieren. Ich habe ein externes Mikrophon eingesteckt und mein dsp ist m.E. 4. Aber warum funktioniert der Befehl

Code:
ffmpeg -i /dev/video0 -i /dev/dsp4 test2.mpg

nicht?
Was ist die Ausgabe von $ mixer /dev/dsp4.0?
Wird denn wenigstens das Video aufgenommen, oder passiert gar nichts?
Um Ton aufzunehmen, muß ich ffmpeg dazusagen, daß es das OSS (Open Sound System) verwenden soll.

Demnach wäre der Befehl: $ ffmpeg -i /dev/video0 -i oss /dev/dsp4 test2.mp4

PS:
Im genannten ffmpeg-Befehl würde ich es einmal mit /dev/dsp7 anstelle von /dev/dsp4 versuchen.
 
Zuletzt bearbeitet:
Guter Artikel!

Zu

und

kam mir in den Sinn, inwieweit der verwendete Container Einfluss nimmt. Du nimmst ja im Beispiel .mp4, ich werfe mal .webm und .mkv in den Ring.
mkv nehme ich immer als Archivcontainer, zum einen wegen des geringeren overheads und der Flexibilität, dass man alles reinstopfen kann. Zu Streamingfunktionalität und ob webm auch alles akzeptiert, kann ich aber nichts sagen.
Nur mal ein Gedankeneinwurf, wollte den Thread nicht kapern. ;)
.webm und .mkv kommen für mich nicht in Frage, weil die auf meinen Macs nur im VLC und ansonsten überhaupt nicht funktionieren, deshalb habe ich die gar nicht erst in Betracht gezogen. Die Setzung des hvec1-Tags ist ja ein Aufwasch mit dem jeweiligen ffmpeg-Befehl und kein Aufwand, man muß das nur wissen. Nur halb unterstützte Containerformate, können viel mehr Aufwand nach sich ziehen. Der kleinste gemeinsame Nenner für alles auf allen Geräten ist nunmal .mp4
 
Was ist die Ausgabe von $ mixer /dev/dsp4.0?
Wird denn wenigstens das Video aufgenommen, oder passiert gar nichts?
Um Ton aufzunehmen, muß ich ffmpeg dazusagen, daß es das OSS (Open Sound System) verwenden soll.

Demnach wäre der Befehl: $ ffmpeg -i /dev/video0 -i oss /dev/dsp4 test2.mp4

PS:
Im genannten ffmpeg-Befehl würde ich es einmal mit /dev/dsp7 anstelle von /dev/dsp4 versuchen.
Code:
$ ffmpeg -i /dev/video0 -i oss /dev/dsp4 test3.mpg
ffmpeg version 4.4.2 Copyright (c) 2000-2021 the FFmpeg developers
  built with FreeBSD clang version 10.0.1 (git@github.com:llvm/llvm-project.git llvmorg-10.0.1-0-gef32c611aa2)
  configuration: --prefix=/usr/local --mandir=/usr/local/man --datadir=/usr/local/share/ffmpeg --pkgconfigdir=/usr/local/libdata/pkgconfig --disable-static --disable-libcelt --enable-shared --enable-pic --enable-gpl --enable-avresample --cc=cc --cxx=c++ --disable-alsa --disable-libopencore-amrnb --disable-libopencore-amrwb --enable-libaom --disable-libaribb24 --enable-asm --enable-libass --disable-libbs2b --disable-libcaca --disable-libcdio --disable-libcodec2 --enable-libdav1d --disable-libdavs2 --disable-libdc1394 --disable-debug --enable-htmlpages --enable-libdrm --disable-libfdk-aac --disable-libflite --enable-fontconfig --enable-libfreetype --enable-frei0r --disable-libfribidi --disable-gcrypt --disable-libglslang --disable-libgme --enable-gmp --enable-gnutls --enable-version3 --disable-libgsm --enable-iconv --disable-libilbc --disable-libjack --disable-libklvanc --disable-libkvazaar --disable-ladspa --enable-libmp3lame --disable-liblensfun --disable-libbluray --disable-librsvg --disable-librtmp --enable-libxml2 --disable-lto --disable-lv2 --disable-mbedtls --disable-libmfx --disable-libmodplug --disable-libmysofa --disable-nonfree --disable-openal --disable-opencl --disable-opengl --disable-libopenh264 --disable-libopenjpeg --disable-libopenmpt --disable-openssl --disable-libopenvino --enable-optimizations --enable-libopus --disable-pocketsphinx --disable-libpulse --disable-librabbitmq --disable-librav1e --disable-librist --enable-runtime-cpudetect --disable-librubberband --disable-sdl2 --disable-libsmbclient --disable-libsnappy --disable-sndio --disable-libsoxr --disable-libspeex --disable-libsrt --disable-libssh --enable-libsvtav1 --disable-libtensorflow --disable-libtesseract --enable-libtheora --disable-libtwolame --disable-libuavs3d --enable-libv4l2 --enable-vaapi --disable-vapoursynth --enable-vdpau --disable-libvidstab --enable-libvmaf --enable-libvorbis --disable-libvo-amrwbenc --enable-libvpx --disable-vulkan --disable-libwebp --enable-libx264 --enable-libx265 --disable-libxavs2 --enable-libxcb --enable-libxvid --disable-outdev=xv --disable-libzimg --disable-libzmq --disable-libzvbi
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 1657038064.481324, bitrate: 147456 kb/s
  Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 640x480, 147456 kb/s, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
oss: No such file or directory

Das gleiche mit /dev/dsp7. Die Flag "-i oss" scheint so nicht zu funktionieren. Und ohne die Flag, also nur mit "-i /dev/dsp" wird gar nichts aufgenommen, es wird gar keine Output-Datei erstellt.


Und:

$ mixer /dev/dsp4.0
mixer: unknown device: /dev/dsp4.0
usage: mixer [-f device] [-s | -S] [dev [+|-][voll[:[+|-]volr]] ...
mixer [-f device] [-s | -S] recsrc ...
mixer [-f device] [-s | -S] {^|+|-|=}rec rdev ...
devices: vol, bass, treble, pcm, speaker, line, mic, mix, rec, igain
rec devices: speaker, line, mic, mix
$ mixer /dev/dsp4.1
mixer: unknown device: /dev/dsp4.1
usage: mixer [-f device] [-s | -S] [dev [+|-][voll[:[+|-]volr]] ...
mixer [-f device] [-s | -S] recsrc ...
mixer [-f device] [-s | -S] {^|+|-|=}rec rdev ...
devices: vol, bass, treble, pcm, speaker, line, mic, mix, rec, igain
rec devices: speaker, line, mic, mix


Und hier: Es muss sich bei dem externen Mikro um dsp4 handeln:

$ cat /devsndstat
cat: /devsndstat: No such file or directory
$ cat /dev/sndstat
Installed devices:
pcm0: <NVIDIA (0x0060) (HDMI/DP 8ch)> (play)
pcm1: <NVIDIA (0x0060) (HDMI/DP 8ch)> (play)
pcm2: <NVIDIA (0x0060) (HDMI/DP 8ch)> (play)
pcm3: <NVIDIA (0x0060) (HDMI/DP 8ch)> (play)
pcm4: <Realtek ALC889A (Rear Analog 7.1/2.0)> (play/rec) default
pcm5: <Realtek ALC889A (Front Analog)> (play/rec)
pcm6: <Realtek ALC889A (Rear Digital)> (play/rec)
pcm7: <USB audio> (rec)
No devices installed from userspace.
$
 
Sorry, in meinem Kommando-Beispiel fehlte ein -f, es muß lauten:

$ ffmpeg -i /dev/video0 -f oss -i /dev/dsp4 test.mp4

Für das Troubleshooting wäre es auch gut, Video und Audio erstmal getrennt zu testen. Wenn beides funktioniert, dann kann man das ja in einem Kommando zusammenfügen und die komplette Aufnahme starten.

Bei mir nur Audio via dsp0 (ich habe keine Kamera angeschlossen) -- nach 7 s habe ich mit q abgebrochen:
$ ffmpeg -f oss -i /dev/dsp0 test.mp4
Code:
ffmpeg version 4.4.2 Copyright (c) 2000-2021 the FFmpeg developers
  built with FreeBSD clang version 11.0.1 (git@github.com:llvm/llvm-project.git llvmorg-11.0.1-0-g43ff75f2c3fe)
  configuration: --prefix=/usr/local --mandir=/usr/local/man --datadir=/usr/local/share/ffmpeg --pkgconfigdir=/usr/local/libdata/pkgconfig --disable-static --disable-libcelt --enable-shared --enable-pic --enable-gpl --enable-avresample --cc=cc --cxx=c++ --disable-alsa --disable-libopencore-amrnb --disable-libopencore-amrwb --enable-libaom --disable-libaribb24 --enable-asm --enable-libass --disable-libbs2b --disable-libcaca --disable-libcdio --disable-libcodec2 --enable-libdav1d --disable-libdavs2 --disable-libdc1394 --disable-debug --enable-htmlpages --enable-libdrm --disable-libfdk-aac --disable-libflite --enable-fontconfig --enable-libfreetype --enable-frei0r --disable-libfribidi --disable-gcrypt --disable-libglslang --disable-libgme --enable-gmp --enable-gnutls --enable-version3 --disable-libgsm --enable-iconv --disable-libilbc --disable-libjack --disable-libklvanc --disable-libkvazaar --disable-ladspa --enable-libmp3lame --disable-liblensfun --disable-libbluray --disable-librsvg --disable-librtmp --enable-libxml2 --disable-lto --disable-lv2 --disable-mbedtls --disable-libmfx --disable-libmodplug --disable-libmysofa --disable-nonfree --disable-openal --disable-opencl --disable-opengl --disable-libopenh264 --disable-libopenjpeg --disable-libopenmpt --disable-openssl --disable-libopenvino --enable-optimizations --enable-libopus --disable-pocketsphinx --disable-libpulse --disable-librabbitmq --disable-librav1e --disable-librist --enable-runtime-cpudetect --disable-librubberband --disable-sdl2 --disable-libsmbclient --disable-libsnappy --disable-sndio --disable-libsoxr --disable-libspeex --disable-libsrt --disable-libssh --enable-libsvtav1 --disable-libtensorflow --disable-libtesseract --enable-libtheora --disable-libtwolame --disable-libuavs3d --enable-libv4l2 --enable-vaapi --disable-vapoursynth --enable-vdpau --disable-libvidstab --enable-libvmaf --enable-libvorbis --disable-libvo-amrwbenc --enable-libvpx --disable-vulkan --disable-libwebp --enable-libx264 --enable-libx265 --disable-libxavs2 --enable-libxcb --enable-libxvid --disable-outdev=xv --disable-libzimg --disable-libzmq --disable-libzvbi
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Guessed Channel Layout for Input Stream #0.0 : stereo
Input #0, oss, from '/dev/dsp0':
  Duration: N/A, start: 1657114791.005130, bitrate: 1536 kb/s
  Stream #0:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (pcm_s16le (native) -> aac (native))
Press [q] to stop, [?] for help
Output #0, mp4, to 'test.mp4':
  Metadata:
    encoder         : Lavf58.76.100
  Stream #0:0: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s
    Metadata:
      encoder         : Lavc58.134.100 aac
size=     113kB time=00:00:06.91 bitrate= 134.4kbits/s speed=0.993x   
video:0kB audio:109kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 4.128955%
[aac @ 0x80f41fe00] Qavg: 224.134

Wenn man das im Kasten hat, dann geht man das Video an, aber das scheint ja bei Dir zu funktionieren.
 
Sorry, in meinem Kommando-Beispiel fehlte ein -f, es muß lauten:

$ ffmpeg -i /dev/video0 -f oss -i /dev/dsp4 test.mp4
Bingo! Vielen Dank! Es funktioniert sowohl mit dsp4 als auch mit dsp7, wobei die Qualität von dsp7 sehr bescheiden ist, das liegt aber dann an der Kamera selbst, deren Videoqualität ebenfalls bescheiden ist. Aber das Prinzip ist jetzt klar, ab jetzt kann ich mich nach besserer Hardware umsehen.
 
Zurück
Oben