ffmpeg otwórz kamerę internetową za pomocą YUYV, ale chcę MJPEG

14

Potrzebuję ffmpeg, aby otworzyć kamerę internetową (logitech c910) w trybie MJPEG, ponieważ kamera internetowa może dawać ~ 24 przy użyciu „protokołu” MJPEG i tylko ~ 10 fps przy użyciu YUYV. Czy mogę wybierać między nimi za pomocą wiersza polecenia ffmpeg?

xx@(none) ~ $ v4l2-ctl --list-formats
ioctl: VIDIOC_ENUM_FMT
    Index       : 0
    Type        : Video Capture
    Pixel Format: 'YUYV'
    Name        : YUV 4:2:2 (YUYV)

    Index       : 1
    Type        : Video Capture
    Pixel Format: 'MJPG' (compressed)
    Name        : MJPEG

Mój obecny wiersz poleceń:

ffmpeg -y -f alsa -i hw:3,0 -f video4linux2 -r 20 -s 1280x720 -i /dev/video0 -acodec libfaac -ab 128k -vcodec libx264 /tmp/web.avi

ffmpeg produkuje uszkodzony strumień h264 podczas nagrywania z kamery, ale normalny strumień h264 podczas nagrywania z x11grab. Kolejne kodeki (mjpeg, mpeg4) działają dobrze z kamerą internetową ... Ale to już inna historia.

zaktualizuj pełne wyjście konsoli ffmpeg: http://pastebin.com/Hzem6CKF (możesz zobaczyć, jak otwiera urządzenie wideo w trybie YUV, ale urządzenie może także zapewnić wyjście MJPEG).

pavelkolodin
źródło

Odpowiedzi:

13

Możesz podać dodatkowe informacje o tym, z czym kamera internetowa może wyświetlać v4l2-ctl --list-formats-ext. Możesz także wyświetlić informacje o kamerze za pomocą ffmpeg, używając -list_formatsopcji wprowadzania:

$ ffmpeg -f video4linux2 -list_formats all -i /dev/video0
[...]
[video4linux2,v4l2 @ 0x1fb7660] Raw       :   yuyv422 :     YUV 4:2:2 (YUYV) : 640x480 160x120 176x144 320x176 320x240 352x288 432x240 544x288 640x360
[video4linux2,v4l2 @ 0x1fb7660] Compressed:     mjpeg :                MJPEG : 640x480 160x120 176x144 320x176 320x240 352x288 432x240 544x288 640x360

Ta kamera internetowa z mojego przykładu może obsługiwać zarówno formaty raw ( yuyv422), jak i skompresowane ( mjpeg), a ffmpegprzy pomocy -input_formatopcji wprowadzania możesz określić, który z nich chcesz .

Przykłady

Strumień skopiuj strumień wideo MJPEG (bez ponownego kodowania):

ffmpeg -f v4l2 -input_format mjpeg -i /dev/video0 -c:v copy output.mkv

Ponownie zakoduj nieprzetworzone wideo z kamery internetowej do H.264:

ffmpeg -f v4l2 -input_format yuyv422 -i /dev/video0 -c:v libx264 -vf format=yuv420p output.mp4

To samo co powyżej, ale ręcznie wybierz liczbę klatek na sekundę i rozmiar wideo ( v4l2-ctl --list-formats-extdla dostępnych częstotliwości klatek i rozmiarów wideo):

ffmpeg -f v4l2 -input_format yuyv422 -framerate 30 -video_size 640x480 -i /dev/video0 -c:v libx264 -vf format=yuv420p output.mp4
  • Więcej informacji znajdziesz w dokumentacji urządzenia wejściowego video4linux2 .

  • Jeśli wyjściowa liczba klatek na sekundę jest niższa niż oczekiwana, dodaj więcej światła: kamera internetowa może obniżać liczbę klatek na sekundę, aby uzyskać dłuższe ekspozycje w ciemnym otoczeniu.

Llogan
źródło
0
ffmpeg -t 60 -f video4linux2 -input_format mjpeg -i /dev/video0 -c:v libx264 -strict -2 /DataVolume/share/Public/v/outputs.mp4
trochę drewna
źródło
4
Witamy w Super User! Czy możesz to rozwinąć? W szczególności, jakie ma informacje, których nie ma LordNekbeard? :)
bertieb
Nie ma potrzeby, -strict -2chyba że: 1) twój ffmpegjest strasznie przestarzały, i 2) kodujesz dźwięk AAC.
llogan