Ffmpeg

嘗試以更高解析度錄製影片時,ffmpeg 掛起

  • July 26, 2017

我正在嘗試使用 USB 攝像頭錄製一些影片,但在使用ffmpeg.

如果我執行ffmpeg -f video4linux2 -t 00:00:10 -i /dev/video0 out.mpg,程序會嘗試以 640x480 解析度錄製並ffmpeg掛起。

但是,如果我添加-sffmpeg並以低於 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.25ffmpeg建構的 2.8.7 版本。busybox主機架構是執行核心 3.2 的 ARM 處理器。

我還嘗試從原始碼編譯最新版本,但問題仍然存在……

找出原因:轉碼和原始數據量。

使用我的問題中提到的命令行,我從原始格式(yuv422)讀取,並將其轉碼為 mpeg-1,這是我的ffmpeg. 從相機流式傳輸的數據量對於處理器來說太多了,導致掛起。我使用的相機也能夠以壓縮格式(mjpeg)進行流式傳輸。通過切換到這種格式,ffmpeg不再掛起,並且能夠以 15 fps 的速度錄製。

但是,有一個轉碼步驟,從 mjpeg 到 mpeg-1。ffmpeg通過告訴複製流,我能夠達到更高的 fps 計數,刪除最後的轉碼步驟。

引用自:https://unix.stackexchange.com/questions/361052