ffmpeg 淡出视频的开始和结束而不重新编码中间部分?

ffmpeg 淡出视频的开始和结束而不重新编码中间部分?

我需要从循环剪辑中创建一个非常长的视频,但它需要在开头淡入并在结尾淡出。我正在获取循环片段并使用以下命令:

ffmpeg -stream_loop 128 -i "{input}" -y -c copy "{output_looped}"

其次是:

ffmpeg -i "{output_looped}" -y -vf "fade=t=in:st=0:d=4,fade=t=out:st=1920:d=4" -c:a copy "{output}"

输入文件和 ffmpeg 信息:

ffmpeg -i input.mp4
ffmpeg version N-94150-g231d0c819f Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 9.1.1 (GCC) 20190621
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
  libavutil      56. 30.100 / 56. 30.100
  libavcodec     58. 53.101 / 58. 53.101
  libavformat    58. 28.101 / 58. 28.101
  libavdevice    58.  7.100 / 58.  7.100
  libavfilter     7. 55.100 /  7. 55.100
  libswscale      5.  4.101 /  5.  4.101
  libswresample   3.  4.100 /  3.  4.100
  libpostproc    55.  4.100 / 55.  4.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41
    creation_time   : 2020-09-08T22:05:04.000000Z
  Duration: 00:00:13.96, start: 0.000000, bitrate: 24636 kb/s
    Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080, 24626 kb/s, 24 fps, 24 tbr, 24k tbn, 48 tbc (default)
    Metadata:
      creation_time   : 2020-09-08T22:05:04.000000Z
      handler_name    : ?Mainconcept Video Media Handler
      encoder         : AVC Coding

但是,由于循环片段太长,ffmpeg(大概)正在重新编码,因此速度非常慢。如果我可以在视频的开头和结尾添加淡出效果,而无需重新编码中间部分,那就太理想了。因此,也许可以将其分成output_looped3 个部分,在开头应用淡入,中间部分保持不变,在结尾应用淡出,然后以某种方式将流重新连接在一起。

这在 ffmpeg 中可行吗?如果可行,你会怎么做?或者有没有其他方法可以避免在应用淡入到开头和淡出到结尾时重新编码中间部分?

答案1

因为您的原始输入相当短,所以仅对第一次和最后一次迭代进行编码既快速又简单。

  1. 制作开始、中间和结束片段:

    ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=4" -profile:v main -video_track_timescale 24k -c:a copy begin.mp4
    ffmpeg -stream_loop 126 -i input.mp4 -c copy middle.mp4
    ffmpeg -i input.mp4 -vf "fade=t=out:st=9.96:d=4" -profile:v main -video_track_timescale 24k -c:a copy end.mp4
    
    • 所有片段必须具有相同的属性才能正确连接。默认情况下,ffmpeg可以处理大多数事情,但对于您的特定文件,必须手动设置 H.264 配置文件和时间刻度,begin.mp4以便end.mp4匹配middle.mp4

    • 您的输入没有音频,但我-c:a copy出于演示目的添加了音频,以防万一。如果您使用-c:a copy没有音频的输入,则没有关系。

  2. 包含input.txt以下内容:

    file 'begin.mp4'
    file 'middle.mp4'
    file 'end.mp4'
    
  3. 使用连接连接解复用器

    ffmpeg -f concat -i input.txt -c copy output.mp4
    

相关内容