【问题标题】:ffplay keep video/audio sync when using select filterffplay 使用选择过滤器时保持视频/音频同步
【发布时间】:2016-08-24 11:38:17
【问题描述】:

我正在尝试使用 ffplay 播放/跳过一些视频片段。我跳过 100 到 400 帧的第一种方法是:

ffplay -vf "select='lte(n\,100)+gte(n\,400)'" -i INPUT

这会跳过所需的帧,但它也会在跳过的帧期间冻结视频。我尝试通过使用 setpts 选项修改视频演示时间戳 (PTS) 来解决此问题:

ffplay -vf "select='lte(n\,100)+gte(n\,400)',setpts='PREV_OUTPTS'" -i INPUT

这似乎工作(仍然冻结一点,猜测是因为缓冲),但现在音频不同步。我已经尝试应用选择过滤器并修改音频上的 PTS

ffplay -vf "select='lte(n\,100)+gte(n\,400)',setpts='PREV_OUTPTS'" -af "aselect='lte(n\,100)+gte(n\,400)',asetpts='PREV_OUTPTS'" -i INPUT

这会跳过一些音频帧,但仍然不同步。我尝试使用 aresample=async=10000 选项,结果相似。将部分/所有过滤器移动到输出(将它们放在 -i INPUT 之后)也不起作用。

有人知道如何使用 ffplay 跳过部分视频吗?非常感谢

【问题讨论】:

    标签: select audio filter ffmpeg synchronization


    【解决方案1】:

    音频帧号!= 视频帧号。 FFmpeg 的编码器生成的 AAC 音频是每帧 1024 个样本,因此 48kHz 流每秒有 48000/1024 = 46.875 个音频帧。其他编解码器可能有不同的速率。

    使用t 代替n,并生成一系列连续的时间戳。

    ffplay
    -vf "select='lte(t\,4)+gte(t\,16)',setpts=N/FRAME_RATE/TB"
    -af "aselect='lte(t\,4)+gte(t\,16)',asetpts=N/SR/TB"
    -i INPUT
    

    我假设视频帧速率为 25 fps。相应修改。

    【讨论】:

    • 谢谢!你是一个绝对的天才。这个帧是精确的还是选择最近的关键帧?
    • 帧精确。过滤器适用于完全解码的帧,因此没有关键帧。
    猜你喜欢
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 2012-12-16
    相关资源
    最近更新 更多