我正在尝试使用 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 计数。