【问题标题】:How to convert MP4 frame rate like 14.939948fps to 15fps如何将 MP4 帧速率(如 14.939948fps)转换为 15fps
【发布时间】:2022-01-17 13:42:53
【问题描述】:

说明

我通过 ffmpeg 将 USB 摄像头流推送到名为 SRS 的 RTMP 流服务器。

SRS 为我保存了一个 MP4 文件。帧速率在 VLC 中不是一个常见的值 - 它是 14.939948。我已经检查过了 - 它似乎是 'ntsc' 格式。

同时,我收到了 OpenCV 的流并将其保存为另一个 MP4 文件。它们没有同步。

我尝试通过 ffmpeg 转换帧率,但仍然不同步。制作它的唯一方法是将其放入 Adob​​e Premiere 和 modify the frame rate。这是我执行的 ffmpeg 命令:

ffmpeg -i 1639444871684_copy.mp4 -filter:v fps=15 out.mp4

除了流服务器,如何将帧率转换为正常并同时保持同步?

【问题讨论】:

  • 我想您要问的是您有一个以每秒 14.939948 帧的速度播放的视频,并且您想对其进行插值以使其以 15 fps 的速度运行,但仍以相同的速度播放。做一些快速的数学运算,您可以通过每 249 帧复制一次来实现这一点。也许是一种电视电影方法,其中插入的帧是它之前的帧和之后的帧之间的混合(即两帧上的 alpha 为 50% 以制作复合模糊帧)。我不知道这是否看起来不错。
  • 谢谢你,塞尔比!我不认为这对我来说是一个简单的方法,但我希望比我更好的人能看到你的答案。

标签: ffmpeg rtmp simple-realtime-server


【解决方案1】:

注意:对于直播,你永远不要依赖 FPS,因为 RTMP/FLV 总是使用固定的 TBN 1k,所以在将流发布为 RTMP 或录制到其他格式(如 TS/MP4)时,总是会引入一些偏差。

注意:对于 WebRTC,fps 是变体,请阅读Would WebRTC use a constant frame rate to capture video frame 或关于Variable Frame Rate (VFR)

不是SRS或FPS的问题,你也可以用FFmpeg回放。

  1. 使用 FFmpeg 将 doc/source.flv 从 25fps 转码为 15fps,然后通过 RTMP(15fps) 发布到 SRS。
  2. 使用 FFmpeg 将 RTMP(15fps) 录制为 output.mp4(15fps)。
  3. 使用 VLC 播放 output.mp4(15fps),它显示 fps IS NOT 15fps。

首先,请通过以下配置启动 SRS,注意 DVR 已禁用:

# ./objs/srs -c test.conf
listen              1935;
daemon              off;
srs_log_tank        console;

vhost __defaultVhost__ {
}

运行FFmpeg转码发布到SRS,将fps改为15:

cd srs/trunk
ffmpeg -re -i doc/source.flv -c:v libx264 -r 15 -c:a copy \
  -f flv rtmp://localhost/live/livestream

将 RTMP 流(15fps)录制到output.mp4,注意 fps 在 FFmpeg 日志中为 15fps:

ffmpeg -f flv -i rtmp://localhost/live/livestream -c copy -y output.mp4

用VLC播放output.mp4是15fps,打开Window -> Media Information,你会发现fps在14.8fps左右变化,而不是15fps!

因为 RTMP/FLV 的 TBN,固定为 1000(1k tbn,每帧大约 66.66666666666667ms),所以在发布 MP4 到 RTMP 流时引入了偏差。不是DVR引起的,是RTMP/FLV TBN引起的。

注意:但是,对于 SRS,使用固定的 TBN 1k 不是一个好的选择,因为它对 MP4 时长不友好,我重新打开问题srs#2790

最终,帧率/fps 不是一个固定的东西,它只是一个数字,可以提供有关流的一些提示。相反,玩家总是使用 DTS/PTS 来决定何时以及如何渲染图片。

【讨论】:

  • 谢谢,您的回答很有帮助!我坚信 SRS 项目可能是最好的。
【解决方案2】:

回答我自己。这是我的方法:通过 OpenCV 读取并以 15FPS 的速度将帧写入新文件。它们将被同步。

【讨论】:

    【解决方案3】:

    -r

    ffmpeg -i 1639444871684_copy.mp4 -r 15 out.mp4
    

    【讨论】:

    • 谢谢!我已经试过了。无法同步。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 2018-09-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多