Ffmpeg
嘗試以更高解析度錄製影片時,ffmpeg 掛起
我正在嘗試使用 USB 攝像頭錄製一些影片,但在使用
ffmpeg
.如果我執行
ffmpeg -f video4linux2 -t 00:00:10 -i /dev/video0 out.mpg
,程序會嘗試以 640x480 解析度錄製並ffmpeg
掛起。但是,如果我添加
-s
到ffmpeg
並以低於 640x480(例如 320x240)的解析度錄製,則影片錄製成功。掛起後,如果我點擊
CTRL+C
,ffmpeg 會恢復,產生一個 0 kB 大小的文件。使用strace
我可以看到ioctl
對設備的呼叫會保留return-EINVAL
和後續ioctl
的 return-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)
任何想法為什麼會發生這種情況?
我使用的是通過1.25
ffmpeg
建構的 2.8.7 版本。busybox
主機架構是執行核心 3.2 的 ARM 處理器。我還嘗試從原始碼編譯最新版本,但問題仍然存在……
找出原因:轉碼和原始數據量。
使用我的問題中提到的命令行,我從原始格式(yuv422)讀取,並將其轉碼為 mpeg-1,這是我的
ffmpeg
. 從相機流式傳輸的數據量對於處理器來說太多了,導致掛起。我使用的相機也能夠以壓縮格式(mjpeg)進行流式傳輸。通過切換到這種格式,ffmpeg
不再掛起,並且能夠以 15 fps 的速度錄製。但是,有一個轉碼步驟,從 mjpeg 到 mpeg-1。
ffmpeg
通過告訴複製流,我能夠達到更高的 fps 計數,刪除最後的轉碼步驟。