
Ich versuche, mit einer USB-Kamera einige Videos aufzunehmen, habe aber bei der Verwendung einige Probleme ffmpeg
.
Wenn ich ausführe ffmpeg -f video4linux2 -t 00:00:10 -i /dev/video0 out.mpg
, versucht das Programm, mit einer Auflösung von 640 x 480 aufzunehmen und ffmpeg
hängt sich auf.
Wenn ich jedoch die -s
Option hinzufüge ffmpeg
und mit einer niedrigeren Auflösung als 640 x 480 (z. B. 320 x 240) aufnehme, wird das Video erfolgreich aufgenommen.
Wenn ich nach einem Hängenbleiben drücke CTRL+C
, wird ffmpeg fortgesetzt und gibt eine Datei mit einer Größe von 0 kB zurück. Mit strace
kann ich sehen, dass ein ioctl
Aufruf des Geräts immer wieder zurückgibt -EINVAL
und anschließend ioctl
s zurückgibt -EAGAIN
.
ioctl(3, VIDIOC_G_STD, 0xbe84dfb0) = -1 EINVAL (Invalid argument)
ioctl(3, VIDIOC_DQBUF, {type=V4L2_BUF_TYPE_VIDEO_CAPTURE}) = -1 EAGAIN (Resource temporarily unavailable)
Irgendwelche Ideen, warum das passiert?
Ich verwende ffmpeg
Version 2.8.7, erstellt bis busybox
1.25. Die Hostarchitektur ist ein ARM-Prozessor mit Kernel 3.2.
Ich habe auch versucht, die neueste Version aus dem Quellcode zu kompilieren, aber das Problem besteht weiterhin ...
Antwort1
Grund herausgefunden: Transkodierung und Rohdatenvolumen.
Mithilfe der in meiner Frage erwähnten Befehlszeile las ich aus einem Rohformat (yuv422) und transkodierte es in MPEG-1, was die Standardkodierung für meine Version von war ffmpeg
. Die von der Kamera gestreamte Datenmenge war einfach zu groß für den Prozessor, was zum Hängen führte. Die von mir verwendete Kamera konnte auch in einem komprimierten Format (mjpeg) streamen. Durch das Umschalten auf dieses Format ffmpeg
hing es nicht mehr und konnte mit 15 fps aufnehmen.
Es gab jedoch einen Transcodierungsschritt von MJPEG nach MPEG-1. Ich konnte eine höhere FPS-Zahl erreichen, indem ich ffmpeg
den Stream anwies, ihn zu kopieren und den letzten Transcodierungsschritt entfernte.