代码之家  ›  专栏  ›  技术社区  ›  bguiz

在关键帧之间剪切视频而不使用ffpeg重新编码整个视频?

  •  0
  • bguiz  · 技术社区  · 5 年前

    我想削减一个视频在任何特定的时间戳开始,它需要 精确的

    而且,这些视频相当长-一个小时或更长-所以我想 避免重新编码 如果可能的话,这是完全的,或者只重新编码总持续时间的一小部分。因此,想最大限度地利用 -vcodec copy .

    如何使用 ffmpeg

    注意:请参阅下面的场景和我自己的大致想法,以获得可能的解决方案。


    • 原创视频
      • 长度为1:00:00
    • 所需切割:
    • 尝试#1:
      • 使用 -ss 0:01:35 -i blah.mp4 -vcodec copy ,结果是一个文件,其中:
      • 音频从0:01:30开始
      • 视频也从0:01:30开始
      • 这会过早启动音频和视频
    • -i blah.mp4 -ss 0:01:35 -vcodec copy ,结果是一个文件,其中:
      • 音频从0:01:35开始,
      • 但视频前5秒是空白/黑色,
        • 直到0:01:40录像开始
      • 这会准时启动音频, 但是视频开始得太晚了

    • (1) 从0:01:30切到0:01:40
      • 重新编码以获得新的关键帧, 包括在0:01:35的目标时间
      • 然后把这个切下来,得到从0:01:35到0:01:40的5秒
    • (2) 切0:01:40直到最后
      • -vcodec副本
    • (3) ffmpeg concat 用第二个长夹子

    我知道/能写出(2)和(3)的命令,但不确定(1)需要什么命令。

    0 回复  |  直到 5 年前
        1
  •  4
  •   llogan    5 年前

    ffprobe -v error -select_streams v:0 -skip_frame nokey -show_entries frame=pkt_pts_time -of csv=p=0 input.mp4
    

    它将输出如下内容:

    0.000000
    2.502000
    3.795000
    6.131000
    10.344000
    12.554000
    16.266000
    ...
    

    假设要删除时间戳0到5,然后 stream copy 剩下的。最接近的关键帧是6.131。

    manually match the profile

    ffmpeg -i input.mp4 -ss 5 -to 6.131 trimmed.mp4
    

    制造 input.txt 对于 concat demuxer :

    file 'trimmed.mp4'
    file 'input.mp4'
    inpoint 6.131
    

    连接:

    ffmpeg -f concat -i input.mp4 -c copy output.mp4
    
        2
  •  2
  •   krishna    5 年前

    尝试

    ffmpeg-i格式src.mp4型-vcodec copy-重置\u时间戳1-映射0输出.mp4

    ffmpeg-i格式src.mp4型-vcodec copy-reset\时间戳1-map 0 src\ m3u8

    推荐文章