尝试以更高分辨率录制视频时 ffmpeg 挂起

尝试以更高分辨率录制视频时 ffmpeg 挂起

我正在尝试使用 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对设备的调用保持 returns-EINVAL和后续的ioctlreturn -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)

有什么想法为什么会发生这种情况吗?

我使用的是ffmpeg2.8.7 版本,通过busybox1.25 构建。主机架构是运行内核 3.2 的 ARM 处理器。

我也尝试从源代码编译最新版本,但问题仍然存在......

答案1

找出原因:转码和原始数据量。

使用我的问题中提到的命令行,我正在读取原始格式(yuv422),并将其转码为 mpeg-1,这是我的ffmpeg.从相机流式传输的数据量对于处理器来说实在太多,导致挂起。我使用的相机也能够以压缩格式(mjpeg)进行流传输。通过切换到这种格式,ffmpeg不再挂起,并且能够以 15 fps 的速度进行录制。

然而,有一个转码步骤,从 mjpeg 到 mpeg-1。通过ffmpeg告诉复制流、删除最后的转码步骤,我能够达到更高的 fps 计数。

相关内容