跳到主要内容

FFMpeg FAQ

提示
  • ffmpeg 不支持自动创建目录

提取音轨

# 确认音频信息
ffprobe in.avi

ffmpeg -i in.avi -vn -acodec copy out.aac # 单音频时
ffmpeg -i in.mkv -map 0:a:3 -c copy out.m4a # 提取 #3
ffmpeg -i in.mov -map 0:a -c copy out.mov # 提取所有
ffmpeg -i in.mp4 -q:a 0 -map a -c copy out.aac # 提取 #0 音轨

添加音轨

# 替换 #0
ffmpeg -i in.mp4 -i in.wav -map 0:v -map 1:a -c:v copy -shortest out.mp4
# 添加 并设置语言
ffmpeg -i in.mkv -i in.mp3 -map 0 -map 1:a -metadata:s:a:1 language=chi -c:v copy -shortest out.mkv
# 混合
ffmpeg -i in.mkv -i in.m4a -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map 0:v -map "[a]" -c:v copy -ac 2 -shortest out.mkv

Protocol 'https' not on whitelist 'file,crypto,data'

ffmpeg -protocol_whitelist file,http,https,tcp,tls,crypto -i MIE.m3u8 -c copy -bsf:a aac_adtstoasc MIE.mp4

FFmpeg Service01.kms key

加密视频

#EXT-X-KEY:MEATHOD=AES-128,URI=""

添加字幕

# 嵌套
# 烧录字幕到视频 -vf subtitles=subtitles.srt
# -vf ass=subtitles.ass
# 单独指定 copy - -c:v copy -c:a copy -c:s mov_text
ffmpeg -i in.mp4 -i in.srt -c copy -c:s mov_text out.mp4

# MKV
# -metadata:s:s:0 language=eng
ffmpeg -i input.mp4 -f srt -i input.srt \
-map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy \
-c:s srt output.mkv

Tag hvc1 incompatible with output codec id avc1

ffmpeg -i in.mp4 -tag:v hvc1 -c:a copy -c:v copy -movflags faststart out.mp4

ffprobe durations is different from ffmpeg

chunk

ffmpeg -i input.mp4 -c copy -map 0 -segment_time 00:10:00 -f segment -reset_timestamps 1 output%03d.mp4
  • 没有 -reset_timestamps 1 可能导致只有第一个能播放

丢弃完全相同帧

mpdecimate

丢弃与上一帧没有太大差异的帧来减少帧率。主要用于非常低比特率的编码(例如通过拨号调制解调器进行流式传输),但理论上也可以用于修复逆向扫描不正确的电影。

8x8 像素块。

  • max
    • 设置可以丢弃的最大连续帧数(如果为正数),或者丢弃帧之间的最小间隔(如果为负数)。如果值为 0,则丢弃帧时不考虑之前连续丢弃的帧数。
    • 默认值:0
  • keep
    • 设置在开始丢弃之前忽略的最大连续相似帧数。如果值为 0,则丢弃帧时不考虑之前连续相似的帧数。
    • 默认值:0
  • hi
    • 设置丢弃阈值的高值。
    • 默认值:64*12=768
    • 最大值:64*255=16320
    • 增加会丢弃更多帧
  • lo
    • 设置丢弃阈值的低值。
    • 默认值:64*5=320
  • frac
    • 设置丢弃阈值的分数值。当 hi 阈值内没有 8x8 块差异超过 hi 且没有超过 frac 块(1 表示整个图像)的差异超过 lo 阈值时,帧是丢弃的候选帧。
    • 默认值:0.33
    • 一张图中多少比例的块可以不同
# more than 1 pixel value difference to previous frame
ffmpeg -i input.mkv -vf mpdecimate=hi=1:lo=1:frac=1:max=0 output.mkv

frame count

ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mp4