【问题标题】:Adding current time as timestamp in H.264 raw stream with few frames在具有少量帧的 H.264 原始流中添加当前时间作为时间戳
【发布时间】:2020-07-13 14:18:58
【问题描述】:

我有一个程序可以输出 H.264 原始流(即 Android 上的 screenrecord)。我正在使用FFmpeg 在帧上添加 PTS(演示时间戳),如下所示:

$ my-program | ffmpeg -i - -filter:v setpts='(RTCTIME - RTCSTART) / (TB * 1000000)' out.mp4

此过滤器计算当前时间,并将其作为 PTS。

问题在于,如果视频没有任何变化,my-program 不会产生任何输出。由于 FFmpeg 似乎在将它们通过setpts 过滤器之前等待一堆帧,因此计算的 PTS 将不正确。特别是,当下一个序列开始时,序列的最后一帧将被加上时间戳。

有没有办法(使用 FFmpeg 或其他方式)将当前时间作为 PTS 添加到 H.264 原始帧,其中“当前时间”是接收帧时,而不是输出它?

注意:问题是不是来自管道的缓冲。

【问题讨论】:

    标签: ffmpeg timestamp video-streaming h.264 video-capture


    【解决方案1】:

    您可以更早地分配时间戳,让 setpts 简单地将其标准化为从 0 开始。

     my-program | ffmpeg -use_wallclock_as_timestamps 1 -i - -filter:v setpts='PTS-STARTPTS' out.mp4
    

    -use_wallclock_as_timestamps 由 libavformat 框架在接收数据包时分配。

    【讨论】:

    • 太棒了,非常感谢 Gyan,效果很好! Android 上 ffmpeg 的 termux 版本似乎太慢了,无法即时执行此操作,因此我正在通过网络传输流。为此目的,基于ffmpeg.org/doxygen/trunk/remuxing_8c_source.html 做一个小程序的任何机会会更快吗?我的目标是封装在 MKV 或任何在我的 Android 在录制期间崩溃时仍可读取的格式。对不起,附带问题!再次感谢您的帮助!
    • 解码和(尤其是)重新编码很慢,而不是 setpts 过滤本身。是的,纯粹的 remuxing 应该快得多,但你必须自己规范化 PTS - 这只是删除第一个数据包的偏移量。
    • 哦,我明白了,那么只需使用 ffmpeg -use_wallclock_as_timestamps 1 -i - -c:v copy out.mkv 就可以完成大部分工作,而我的 Android 平板电脑实际上可以足够快地完成这项工作。然后我可以在我的计算机上重新规范化(尽管文件似乎在没有重新规范化的情况下可以正常播放)。如果我的平板电脑在录制过程中崩溃,MKV 文件仍然可以通过正确的时间戳读取,所以我可以挽救它。完美的!非常感谢 Gyan,继续努力!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    相关资源
    最近更新 更多