select
  • audio
  • filter
  • ffmpeg
  • synchronization
  • 2016-08-24 77 views 0 likes 
    0

    我试图播放/使用ffplay跳过视频的某些片段。我的第一个跳过的方法说帧100至400是:ffplay使用选择过滤器时保持视频/音频同步

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

    此跳过所需的帧,但是它也冻结了跳帧时视频。我试图通过修改视频显示时间标记(PTS)与setpts选项来解决这个问题:

    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跳过部分视频吗?非常感谢

    回答

    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。相应地修改。

    +0

    谢谢!你是一个绝对的天才。这个帧是精确的还是它选择最近的关键帧? – arrietaeguren

    +0

    框架精确。过滤器在完全解码的帧上工作,所以没有关键帧。 – Mulvya

    相关问题