ffmpeg命令的一些应用

杂项 · 08-02

虽然距离第一次总结ffmpeg指令与剪辑视频相关的姿势 (github.com)已经过去了三年,但是依旧是非常业余的水平。仅作个人记录,谨慎参考,表述有问题的地方欢迎讨论指正。

视频剪切

需求是尽可能无损剪切,精确时间。

根据视频关键帧的情况,分两种方案

  1. 极速方案,无损截取出视频两个关键帧之间的片段。

    ffmpeg -ss [start_time] -to [end_time] -accurate_seek -i [in_file] -codec copy -avoid_negative_ts 1 -map_metadata -1 [out_file]
    ## example
    ffmpeg -ss 00:42:50 -to 00:46:02 -accurate_seek -i input.mp4 -codec copy -avoid_negative_ts 1 -map_metadata -1 output.mp4

    注意:start_time,end_time的选取,需要是关键帧时刻之后的时间点。(印象在ffmpeg官方文档力看过这个说明)

    PotPlayer中快捷键Ctrl+Shift+←/→,可以跳转前后关键帧;G 显示当前时刻。

    如果关键帧所在时刻不符合要求,则无法使用。

  2. 慢速方案,对视频重编码进行精确剪切

    指令与上一个差不多,但输出编码不使用copy。进行重编码的同时,可以对视频格式、码率进行修改。

    (视频格式,应该是要与编码格式进行对应,这个还不太了解)

    命令举例如下

    ffmpeg -ss [start_time] -to [end_time] -i [in_file] -c:v [libx264] -c:a [aac] -b:v [num] -b:a [num] -strict experimental -map_metadata -1 [out_file]
    ## example
    ffmpeg -ss [start] -to [end] -i "ML4th DAY3.mkv"  -c:v libx264 -c:a aac -b:v 5M -b:a 320K -strict experimental -map_metadata -1 -y output.mp4

    -c:v 是 -vcodec的缩写,指定输出视频编码格式

    -c:a 是 -acodec的缩写,指定输出音频编码格式(-codec 就是二者的合体)

    -b 指定音视频整体码率,或者分别指定音视频码率

    -b:v 视频码率

    -b:a 音频码率

    注意:在某些情况下这样截切出来的视频时间也不准?原因未知?

    查阅可知【链接?】,将输入视频参数放在时间之前,则可以精确剪切。不过这样会更慢。

    ffmpeg -i [in_file] -ss [start_time] -to [end_time]  -c:v [libx264] -c:a [aac] -strict experimental -map_metadata -1 [out_file]

总之,记得剪完视频后检查开始与结束时间点是否有问题。

字幕压制

同时可以结合上面的一些其他参数,音视频编码格式或码率等

ffmpeg -i output.mp4 -vf "ass=ass_test.ass" result.mp4
ffmpeg -i output.mp4 -vf subtitles=srt_test.srt result.mp4

视频片段合并

准备一个合并列表文件,如filelist.txt。(仅在两个视频编码方式一致的情况下测试过)

file 'ML2nd-day1-1.mp4'
file 'ML2nd-day1-2.mp4'

然后运行

ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4

增加空白音频片段

  1. 生成目标长度的空白音频,参考link

    ffmpeg -f lavfi -i anullsrc=channel_layout=2.0:sample_rate=44100 -t 1 silence.m4a
  2. 将空白音频与原音频合并

    ffmpeg -f concat -i input.txt -codec copy meru_short_sil.m4a
    # input.txt
    file 'silence.m4a'
    file 'meru_short.m4a'

音视频轨道合并

ffmpeg -i meru2.mp4 -i meru_short_sil.m4a -c:v copy -c:a aac -strict experimental output.mp4

调用硬件加速

需要安装CUDA -hwaccel_device 0表示调用第0块显卡

示例如下:

ffmpeg -hwaccel cuvid -hwaccel_device 0 -i new.mp4 -c:v h264_nvenc -c:a copy -strict experimental -map_metadata -1 -y new_gpu.mp4

m1 macbook调用硬件加速

ffmpeg -i new.mp4 -c:v hevc_videotoolbox -c:a copy -strict experimental -map_metadata -1 -y new_gpu.mp4

以下久未测试,仅作备份记录

一图流音视频

广播剧 一图流时用的

-r 30 30帧

ffmpeg -r 30 -f image2 -loop 1 -i 0017.png -i drama.wav -s 1280x720 -t 1472 -vcodec libx264 -acodec copy -b:a 1.4M -y drama.mp4

使用其他音轨

-map 0:0 -map 0:3 这个?

ffmpeg -ss 2:38:41 -to 02:43:55 -accurate_seek -i in.mp4 -codec copy -avoid_negative_ts 1 -map 0:0 -map 0:3 -map_metadata -1 -y re_test.mp4

  1. 1 09-04

    1

  2. 1 09-04

    1

  3. 1 09-04

    1

    1. 1 09-04
      @1

      555

    2. 1 09-04
      @1

      555

    3. 1 09-04
      @1

      1

    4. 1 09-04
      @1

      1

  4. 1 09-04

    1

    1. 1 09-04
      @1

      555

    2. 1 09-04
      @1

      555

  5. 1 09-04

    1

    1. 1 09-04
      @1

      555

Theme Jasmine by Kent Liao