【问题标题】:ffmpeg records 5 frames per second on a device that cheese records at 20 fpsffmpeg 在奶酪以 20 fps 录制的设备上每秒录制 5 帧
【发布时间】:2017-07-07 00:11:10
【问题描述】:

在我的内置网络摄像头上运行以下ffmpeg 捕获:

ffmpeg -f v4l2 -framerate 30 -video_size 1920x1080 -i /dev/video0 output.mkv

我只有 5 fps 并看到这条消息:

The driver changed the time per frame from 1/30 to 1/5

当我使用奶酪录制时,我在该设备上获得了 20 fps 的效果。而v4l2 似乎声称它可以达到 30 fps。

v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
    Index       : 0
    Type        : Video Capture
    Pixel Format: 'MJPG' (compressed)
    Name        : Motion-JPEG
        Size: Discrete 1920x1080
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1280x720
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 800x600
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x360
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 160x120
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 320x240
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)

    Index       : 1
    Type        : Video Capture
    Pixel Format: 'YUYV'
    Name        : YUYV 4:2:2
        Size: Discrete 1920x1080
            Interval: Discrete 0.200s (5.000 fps)
        Size: Discrete 1280x720
            Interval: Discrete 0.100s (10.000 fps)
        Size: Discrete 800x600
            Interval: Discrete 0.050s (20.000 fps)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x360
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 160x120
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 320x240
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)

当我运行 ffmpeg 时:

Output #0, mjpeg, to 'output.mjpg':
  Metadata:
    encoder         : Lavf56.40.101
    Stream #0:0: Video: mjpeg, yuvj422p(pc), 1920x1080, q=2-31, 200 kb/s, 5 fps, 5 tbn, 5 tbc
    Metadata:
      encoder         : Lavc56.60.100 mjpeg

我的猜测是它以原始形式从设备录制并在 ffmpeg 中进行编码。如果这是正确的,我将如何让 ffmpeg 使用 mjpeg 原生格式?

【问题讨论】:

  • 如果在 PC 上尝试使用值为 3 或 4 的“线程”开关
  • @RobertRowntree 这个数字取决于你的 CPU 的核心数量,你不应该推荐一些没有解释的任意数字。

标签: ffmpeg video-capture


【解决方案1】:

我需要以我的网络摄像头支持的本机压缩运动 jpeg 格式进行录制。一旦我进行了配置(见下文),它就会以 30 fps 的速度以全分辨率录制。

ffmpeg -f v4l2 -framerate 30 -video_size 1920x1080 -c:v mjpeg -i /dev/video0 -c:v copy output.mov

注意-i(输入)之前的-c:v(视频编解码器)表示设备应使用的录制编解码器(我的网络摄像头原生支持mjpeg),而-c:v(视频编解码器)之后的-c:v(视频编解码器) -i(输入)表示 ffmpeg 应转换为的录制编解码器。 copy 不会更改编解码器,它只是复制设备提供的字节。

【讨论】:

  • 您正在对输入进行转码。在output.mov 之前添加-c copy 以避免这种情况。
  • 谢谢,我确实发现了这一点。我更新了答案。感谢您的评论。
  • copy uses the same codec as was provided by the input. --> 没有。 copy,正如它所说,复制流数据包。如果您也将-c:v mjpeg 放在它的位置,那也将是相同的编解码器,但会发生转码。
  • 感谢您指出措辞,这就是我的意思,但英语甚至比 bash 脚本更狡猾。 :) 更新了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
相关资源
最近更新 更多