
我正在嘗試使用 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
對設備的呼叫保持 returns-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)
有什麼想法為什麼會發生這種情況嗎?
我使用的是ffmpeg
2.8.7 版本,透過busybox
1.25 建置。主機架構是運行核心 3.2 的 ARM 處理器。
我也嘗試從源代碼編譯最新版本,但問題仍然存在...
答案1
找出原因:轉碼和原始資料量。
使用我的問題中提到的命令行,我正在讀取原始格式(yuv422),並將其轉碼為 mpeg-1,這是我的ffmpeg
.從相機串流的資料量對於處理器來說實在太多,導致掛起。我使用的相機也能夠以壓縮格式(mjpeg)進行串流傳輸。透過切換到這種格式,ffmpeg
不再掛起,並且能夠以 15 fps 的速度進行錄製。
然而,有一個轉碼步驟,從 mjpeg 到 mpeg-1。透過ffmpeg
告訴複製串流、刪除最後的轉碼步驟,我能夠達到更高的 fps 計數。