当前位置:   article > 正文

FFmpeg命令裁剪和合并视频_ffmpeg剪辑视频

ffmpeg剪辑视频

FFmpeg命令过滤器

生成测试文件

  • 找三个不同的视频每个视频截取10秒内容

    ffmpeg -i test_video_01.mp4 -ss 00:00:00 -t 10 -codec copy test_video_01_cut.mp4
    ffmpeg -i test_video_02.mp4 -ss 00:00:00 -t 10 -codec copy test_video_02_cut.mp4
    ffmpeg -i test_video_03.mp4 -ss 00:00:00 -t 10 -codec copy test_video_03_cut.mp4
    #如果音视频格式不统一则强制统一为:
    -vcodec libx264 -acodec aac
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 这些命令会将视频文件裁剪为前 10 秒,并将视频编码器设置为 libx264,音频编码器设置为 AAC。可以使用-strict -2 参数用于避免警告信息。
  • 将上述test_video_01_cut.mp4/test_video_02_cut.mp4/test_video_03_cut.mp4转换成ts格式

    ffmpeg -i test_video_01_cut.mp4 -codec copy -vbsf h264_mp4toannexb test_video_01_cut_ts.ts
    ffmpeg -i test_video_02_cut.mp4 -codec copy -vbsf h264_mp4toannexb test_video_02_cut_ts.ts
    ffmpeg -i test_video_03_cut.mp4 -codec copy -vbsf h264_mp4toannexb test_video_03_cut_ts.ts
    
    • 1
    • 2
    • 3
    • -i test_video_01_cut.mp4:指定输入文件为 test_video_01_cut.mp4,裁剪后的视频文件。
    • -codec copy:指定视频和音频编解码器都为 copy,表示将视频流和音频流直接复制到输出文件中,而不进行重新编码。
    • -vbsf h264_mp4toannexb:指定使用 h264_mp4toannexb 过滤器,将 H.264 编码的视频流转换为 Annex B 格式。
    • test_video_01_cut_ts.ts:指定输出文件名为 test_video_01_cut_ts.ts,即将转换后的视频保存为 MPEG-2 Transport Stream (TS) 格式文件。

    同样的过程适用于 test_video_02_cut.mp4test_video_03_cut.mp4 文件。

  • 转换成flv格式

    ffmpeg -i test_video_01_cut.mp4 -codec copy test_video_01_cut_flv.flv
    ffmpeg -i test_video_02_cut.mp4 -codec copy test_video_02_cut_flv.flv
    ffmpeg -i test_video_03_cut.mp4 -codec copy test_video_03_cut_flv.flv
    
    • 1
    • 2
    • 3
    • -i test_video_01_cut.mp4:指定输入文件为 test_video_01_cut.mp4,裁剪后的视频文件。
    • -codec copy:指定视频和音频编解码器都为 copy,表示将视频流和音频流直接复制到输出文件中,而不进行重新编码。
    • test_video_01_cut_flv.flv:指定输出文件名为 test_video_01_cut_flv.flv,即将裁剪后的视频保存为 FLV 格式文件。

    这些命令将输入的裁剪后的视频文件转换为 FLV 格式的文件,并保持了视频和音频编解码方式不变。

  • 分离某些封装格式(例如MP4/FLV/MKV等)中的H.264的时候,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS而无法播放。H.264码流的SPS和PPS信息存储在AVCodecContext结构体的extradata中,需要使用FFmpeg中名称为“h264_mp4toannexb”的bitstream filter处理。

开始拼接文件

  • 以MP4格式进行拼接

    1. ffmpeg -i "concat:test_video_01_cut.mp4|test_video_02_cut.mp4|test_video_03_cut.mp4" -codec copy output_test_video_mp4.mp4
      
      • 1
      • 这个命令将会将三个输入文件 test_video_01_cut.mp4test_video_02_cut.mp4test_video_03_cut.mp4 拼接起来,并将结果保存为 output_test_video_mp4.mp4 文件,保持视频和音频流不变。
    2. ffmpeg -f concat -i mp4list.txt -codec copy output_test_video_mp4.mp4
      
      • 1
      • 其中mp4list.txt的具体内容如下:

        file 'test_video_01_cut.mp4'
        file 'test_video_02_cut.mp4'
        file 'test_video_03_cut.mp4'
        
        • 1
        • 2
        • 3
      • -f concat:指定使用 concat 协议。

      • -i mp4list.txt:指定输入文件为 mp4list.txt,其中包含了要拼接的视频文件列表。这个文件应该是一个文本文件,每行包含一个视频文件的路径。

      • -codec copy:指定视频和音频编解码器都为 copy,表示将视频流和音频流直接复制到输出文件中,而不进行重新编码。

      • output_test_video_mp4.mp4:指定输出文件名为 output_test_video_mp4.mp4,即将拼接后的视频保存为一个 MP4 格式文件。

      确保 mp4list.txt 中的视频文件路径是正确的,并且文件列表格式正确,每行一个文件路径。这样,FFmpeg 将会按照列表中文件的顺序将它们拼接在一起,输出一个 MP4 文件。

  • 以TS格式进行拼接

    1. ffmpeg -i "concat:test_video_01_cut_ts.ts|test_video_02_cut_ts.ts|test_video_03_cut_ts.ts" -codec copy output_test_video_ts.mp4
      
      • 1
      • -i "concat:test_video_01_cut_ts.ts|test_video_02_cut_ts.ts|test_video_03_cut_ts.ts":指定输入文件列表,使用 concat 协议来指定多个文件的路径,这些文件将被拼接在一起。竖线 | 用于分隔文件路径。在这里,三个 TS 文件 test_video_01_cut_ts.tstest_video_02_cut_ts.tstest_video_03_cut_ts.ts 被指定为输入文件。
      • -codec copy:指定视频和音频编解码器都为 copy,表示将视频流和音频流直接复制到输出文件中,而不进行重新编码。这保持了视频和音频的原始编码格式和质量。
      • output_test_video_ts.mp4:指定输出文件名为 output_test_video_ts.mp4,即将拼接后的视频保存为 MP4 格式文件。

      这个命令可以将多个 TS 格式的视频文件合并成一个 MP4 文件,而不进行任何重新编码,从而快速、高效地实现文件合并。

    2. ffmpeg -f concat -i tslist.txt -codec copy output_test_video_ts.mp4
      
      • 1
      • 其中tslist.txt的具体内容如下:

        file 'test_video_01_cut_ts.ts'
        file 'test_video_02_cut_ts.ts'
        file 'test_video_03_cut_ts.ts'
        
        • 1
        • 2
        • 3
      • -f concat:指定使用 concat 协议来读取输入文件。

      • -i tslist.txt:指定输入文件为 tslist.txt,这个文件包含了要拼接的 TS 文件的路径列表。tslist.txt 应该是一个文本文件,每行包含一个 TS 文件的路径。

      • -codec copy:指定视频和音频编解码器都为 copy,表示将视频流和音频流直接复制到输出文件中,而不进行重新编码。这保持了视频和音频的原始编码格式和质量。

      • output_test_video_ts.mp4:指定输出文件名为 output_test_video_ts.mp4,即将拼接后的视频保存为 MP4 格式文件。

      这个命令能够从一个 TS 文件列表中读取并拼接视频文件,而不进行任何重新编码,从而实现了快速、高效地文件合并。

  • 以FLV格式进行拼接

    1. ffmpeg -i "concat:test_video_01_cut_flv.flv|test_video_02_cut_flv.flv|test_video_03_cut_flv.flv" -codec copy output_test_video_flv.mp4
      
      • 1
      • -i "concat:test_video_01_cut_flv.flv|test_video_02_cut_flv.flv|test_video_03_cut_flv.flv":指定输入文件列表,使用 concat 协议来指定多个文件的路径,这些文件将被拼接在一起。竖线 | 用于分隔文件路径。在这里,三个 FLV 文件 test_video_01_cut_flv.flvtest_video_02_cut_flv.flvtest_video_03_cut_flv.flv 被指定为输入文件。
      • -codec copy(或 -c copy):指定视频和音频编解码器都为 copy,表示将视频流和音频流直接复制到输出文件中,而不进行重新编码。这保持了视频和音频的原始编码格式和质量。
      • output_test_video_flv.mp4:指定输出文件名为 output_test_video_flv.mp4,即将拼接后的视频保存为 MP4 格式文件。

      这个命令可以将多个 FLV 格式的视频文件合并成一个 MP4 文件,而不进行任何重新编码,从而实现了快速、高效地文件合并。

    2. ffmpeg -f concat -i flvlist.txt -codec copy output_test_video_flv.mp4
      
      • 1
      • 其中flvlist.txt的具体内容如下:

        file 'test_video_01_cut_flv.flv'
        file 'test_video_02_cut_flv.flv'
        file 'test_video_03_cut_flv.flv'
        
        • 1
        • 2
        • 3
      • -f concat:指定使用 concat 协议来读取输入文件。

      • -i flvlist.txt:指定输入文件为 flvlist.txt,这个文件包含了要拼接的 FLV 文件的路径列表。flvlist.txt 应该是一个文本文件,每行包含一个 FLV 文件的路径。

      • -codec copy(或 -c copy):指定视频和音频编解码器都为 copy,表示将视频流和音频流直接复制到输出文件中,而不进行重新编码。这保持了视频和音频的原始编码格式和质量。

      • output_test_video_flv.mp4:指定输出文件名为 output_test_video_flv.mp4,即将拼接后的视频保存为 MP4 格式文件。

      这个命令能够从一个 FLV 文件列表中读取并拼接视频文件,而不进行任何重新编码,从而实现了快速、高效地文件合并。

  • 方法1只适用于部分封装格式,比如TS

  • 建议:

    1. 使用方法2进行拼接
    2. 转换成TS格式再进行拼接

测试不同编码拼接

  • 修改音频编码

    ffmpeg -i test_video_02.mp4 -vcodec copy -acodec ac3 -vbsf h264_mp4toannexb test_video_02_ac3_h264.mp4
    
    • 1
    • -i test_video_02.mp4:指定输入文件为 test_video_02.mp4
    • -vcodec copy:指定视频编解码器为 copy,表示直接复制视频流而不进行重新编码。
    • -acodec ac3:指定音频编解码器为 AC-3,表示重新编码音频流为 AC-3 格式。
    • -vbsf h264_mp4toannexb:指定视频比特流过滤器,用于将 H.264 视频流重新封装为 H.264 Annex B 格式。
    • test_video_02_ac3_h264.mp4:指定输出文件名为 test_video_02_ac3_h264.mp4,即将结果保存为该文件。

    这个命令可以实现将输入文件的视频流直接复制,音频流重新编码为 AC-3 格式,并重新封装视频流为 H.264 Annex B 格式的功能。

    ffmpeg -i "concat:test_video_01_cut_ts.ts|test_video_02_cut_ts.ts|test_video_03_cut_ts.ts" -codec copy output_test_video.mp4
    #第二段没声音
    
    • 1
    • 2
    • -i "concat:test_video_01_cut_ts.ts|test_video_02_cut_ts.ts|test_video_03_cut_ts.ts":指定输入文件为通过 concat 协议拼接的多个 TS 文件。这个参数告诉 FFmpeg 从这些文件中读取数据,并进行拼接操作。每个文件路径之间使用竖线 | 分隔。
    • -codec copy(或 -c copy):指定视频和音频编解码器都为 copy,表示将视频流和音频流直接复制到输出文件中,而不进行重新编码。这样可以保持视频和音频的原始编码格式和质量。
    • output_test_video.mp4:指定输出文件名为 output_test_video.mp4,即将拼接后的视频保存为 MP4 格式文件。

    这个命令能够将多个 TS 格式的视频文件合并成一个 MP4 文件,而不进行任何重新编码,从而实现了快速、高效地文件合并。

  • 修改音频采样率

    ffmpeg -i test_video_02.mp4 -vcodec copy -acodec aac -ar 96000 -vbsf h264_mp4toannexb test_video_02_cut_ts.ts
    
    • 1
    • -i test_video_02.mp4:指定输入文件为 test_video_02.mp4
    • -vcodec copy:指定视频编解码器为 copy,表示直接复制视频流而不进行重新编码。
    • -acodec aac:指定音频编解码器为 AAC,表示重新编码音频流为 AAC 格式。
    • -ar 96000:指定音频采样率为 96000 Hz,这是 AAC 格式的典型采样率之一。
    • -vbsf h264_mp4toannexb:指定视频比特流过滤器,用于将 H.264 视频流重新封装为 H.264 Annex B 格式。
    • test_video_02_cut_ts.ts:指定输出文件名为 test_video_02_cut_ts.ts,即将结果保存为该文件。

    这个命令可以实现将输入文件的视频流直接复制,音频流重新编码为 AAC 格式,并重新封装视频流为 H.264 Annex B 格式的功能。

    ffmpeg -i "concat:test_video_01_cut_ts.ts|test_video_02_cut_ts.ts|test_video_03_cut_ts.ts" -codec copy output_test_video.mp4
    #第二段播放异常
    
    • 1
    • 2
  • 修改视频编码格式

    ffmpeg -i test_video_01_cut.mp4 -acodec copy -vcodec libx265 test_video_02_cut_ts.ts
    
    • 1
    • -i test_video_01_cut.mp4:指定输入文件为 test_video_01_cut.mp4
    • -acodec copy:指定音频编解码器为 copy,表示直接复制音频流而不进行重新编码。
    • -vcodec libx265:指定视频编解码器为 libx265,表示将视频流重新编码为 H.265 格式。
    • test_video_02_cut_ts.ts:指定输出文件名为 test_video_02_cut_ts.ts,即将结果保存为该文件。

    这个命令将视频流重新编码为 H.265 格式,并将音频流直接复制到输出文件中,以保持音频的原始编码格式和质量。

    ffmpeg -i "concat:test_video_01_cut_ts.ts|test_video_02_cut_ts.ts|test_video_03_cut_ts.ts" -codec copy output_test_video.mp4
    
    • 1
  • 修改视频分辨率

    ffmpeg -i test_video_01_cut.mp4 -acodec copy -vcodec libx264 -s 800x600 -vbsf h264_mp4toannexb test_video_01_cut_ts.ts
    
    • 1
    • -i test_video_01_cut.mp4:指定输入文件为 test_video_01_cut.mp4
    • -acodec copy:指定音频编解码器为 copy,表示直接复制音频流而不进行重新编码。
    • -vcodec libx264:指定视频编解码器为 libx264,表示将视频流重新编码为 H.264 格式。
    • -s 800x600:指定输出视频的分辨率为 800x600。
    • -vbsf h264_mp4toannexb:指定视频比特流过滤器,用于将 H.264 视频流重新封装为 H.264 Annex B 格式。
    • test_video_01_cut_ts.ts:指定输出文件名为 test_video_01_cut_ts.ts,即将结果保存为该文件。

    这个命令将视频流重新编码为 H.264 格式,并将音频流直接复制到输出文件中,以保持音频的原始编码格式和质量。同时,指定了输出视频的分辨率为 800x600。

    ffmpeg -i "concat:test_video_01_cut_ts.ts|test_video_02_cut_ts.ts|test_video_03_cut_ts.ts" -codec copy out4.mp4
    
    • 1
    • 音视频默认显示窗口会以第一个test_video_01_cut_ts.ts修改后的分辨率800x600为基准
  • 注意:

    • 把每个视频封装格式统一为ts,拼接输出的时候再输出需要的封装格式,比如MP4等
    • 视频分辨率可以不同,但是编码格式需要统一
    • 音频编码格式以及音频参数(采样率/声道等)也需要统一
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/833898
推荐阅读
  

闽ICP备14008679号