任务 1: 查看媒体信息 (侦察)
- 目的: 学会使用 ffprobe 分析文件。
- 命令: ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
- 分析: 查看输出的 JSON。找到视频流(codec_type: “video”)和音频流(codec_type: “audio”),记下它们的编码格式(codec_name,如 h264, aac)、分辨率(width, height)、时长(duration)。
ffprobe
:FFmpeg 套件中的媒体信息分析工具,用于提取视频、音频文件的元数据(如编码格式、分辨率、比特率等)。-v quiet
:设置日志级别为 “安静模式”,不输出任何冗余日志(只返回结果数据)。-print_format json
:指定输出格式为 JSON,方便程序解析(默认是文本格式)。-show_format
:显示媒体文件的整体格式信息(如文件大小、时长、比特率等)。-show_streams
:显示文件中每个流的详细信息(视频流、音频流、字幕流等各自的参数)。input.mp4
:目标媒体文件路径(可以是本地文件或网络流地址,如 HTTP-FLV、HLS 等)。
"streams": [
{
"index": 0,
"codec_name": "mpeg4",
"codec_long_name": "MPEG-4 part 2",
"profile": "Simple Profile",
"codec_type": "video",
"codec_tag_string": "mp4v",
"codec_tag": "0x7634706d",
"width": 1440,
"height": 1080,
"coded_width": 1440,
"coded_height": 1080,
"closed_captions": 0,
"film_grain": 0,
"has_b_frames": 0,
"sample_aspect_ratio": "1:1",
"display_aspect_ratio": "4:3",
"pix_fmt": "yuv420p",
"level": 1,
"chroma_location": "left",
"refs": 1,
"quarter_sample": "false",
"divx_packed": "false",
"id": "0x1",
"r_frame_rate": "15/1",
"avg_frame_rate": "15/1",
"time_base": "1/15360",
"start_pts": 0,
"start_time": "0.000000",
"duration_ts": 1761280,
"duration": "114.666667",
"bit_rate": "1199423",
"nb_frames": "1720",
"extradata_size": 47,
"disposition": {
"default": 1,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0,
"timed_thumbnails": 0,
"non_diegetic": 0,
"captions": 0,
"descriptions": 0,
"metadata": 0,
"dependent": 0,
"still_image": 0,
"multilayer": 0
},
"tags": {
"language": "und",
"handler_name": "VideoHandler",
"vendor_id": "[0][0][0][0]",
"encoder": "Lavc61.19.101 mpeg4"
}
},
{
"index": 1,
"codec_name": "aac",
"codec_long_name": "AAC (Advanced Audio Coding)",
"profile": "LC",
"codec_type": "audio",
"codec_tag_string": "mp4a",
"codec_tag": "0x6134706d",
"sample_fmt": "fltp",
"sample_rate": "44100",
"channels": 2,
"channel_layout": "stereo",
"bits_per_sample": 0,
"initial_padding": 0,
"id": "0x2",
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"time_base": "1/44100",
"start_pts": 0,
"start_time": "0.000000",
"duration_ts": 5052405,
"duration": "114.567007",
"bit_rate": "121564",
"nb_frames": "4935",
"extradata_size": 5,
"disposition": {
"default": 1,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0,
"timed_thumbnails": 0,
"non_diegetic": 0,
"captions": 0,
"descriptions": 0,
"metadata": 0,
"dependent": 0,
"still_image": 0,
"multilayer": 0
},
"tags": {
"language": "und",
"handler_name": "SoundHandler",
"vendor_id": "[0][0][0][0]"
}
}
],
"format": {
"filename": "test.mp4",
"nb_streams": 2,
"nb_programs": 0,
"nb_stream_groups": 0,
"format_name": "mov,mp4,m4a,3gp,3g2,mj2",
"format_long_name": "QuickTime / MOV",
"start_time": "0.000000",
"duration": "114.666667",
"size": "18981220",
"bit_rate": "1324271",
"probe_score": 100,
"tags": {
"major_brand": "isom",
"minor_version": "512",
"compatible_brands": "isomiso2mp41",
"encoder": "Lavf61.7.100",
"description": "Bilibili VXCode Swarm Transcoder r0.2.61(gap_fixed:False)"
}
}
}
任务 2: 快速转封装 (不重新编码)
目的: 理解转封装和转码的区别,感受 copy 的速度。
命令 1 (MP4 -> MKV): ffmpeg -i input.mp4 -c copy output.mkv
命令 2 (MP4 -> FLV): ffmpeg -i input.mp4 -c copy output.flv
观察: 这两个命令的执行速度应该非常快(几乎是瞬时完成),因为它们只改变了“集装箱”(封装格式),没有动里面的“货物”(音视频编码数据)。
ffmpeg
:FFmpeg 工具的主命令,用于音视频处理(转码、格式转换、剪辑等)。-i input.mp4
:-i
是输入文件参数,指定源文件为input.mp4
(可以是本地文件或网络流地址)。-c copy
:-c
是编码器参数,copy
表示「流复制」模式 —— 直接复制输入文件中的音视频流,不进行重新编码(速度极快,无质量损失)。- 等效于
-codec copy
,可单独指定流类型(如-c:v copy
仅复制视频流,-c:a copy
仅复制音频流)。
- 等效于
output.mk
:输出文件路径及名称,mk
是文件扩展名(通常建议使用标准格式扩展名如.mp4
、.mkv
等,避免播放器识别问题)。
核心特点:由于使用
-c copy
,命令执行时仅修改容器格式(封装),不触碰原始音视频数据,因此速度极快(通常几秒内完成),且完全保留原始画质和音质。
任务 3: 提取视频流 (分离)
目的: 学会使用 -vn / -an。
命令 (提取视频,去掉音频): ffmpeg -i input.mp4 -c:v copy -an output_video_only.mp4
观察: 播放 output_video_only.mp4,它应该只有画面,没有声音。
ffmpeg
:FFmpeg 主程序,用于音视频处理。-i input.mp4
:-i
指定输入文件为input.mp4
。-c:v copy
:-c:v
表示视频编码器,copy
表示直接复制原始视频流(不重新编码,保留画质且速度快)。-an
:-a
表示音频,n
表示 “无”,即移除所有音频轨道(最终输出无声音)。output_video_only.mp4
:输出文件路径及名称,仅包含视频流。
效果:生成的
output_video_only.mp4
保留原视频的编码、分辨率等参数,但无任何音频,适合仅需视频画面的场景(如静音素材剪辑)。
任务 4: 提取音频流 (分离)
目的: 将视频中的音频保存为独立的音乐文件。
命令 (提取音频为 AAC): ffmpeg -i input.mp4 -c:a copy -vn output_audio_only.aac
命令 (提取音频并转码为 MP3): ffmpeg -i input.mp4 -c:a mp3 -vn output_audio.mp3
观察: 第二个命令会比第一个慢,因为它需要对 AAC 音频进行重新编码为 MP3。
ffmpeg -i test.flv -c:v copy -c:a copy output.mp4
显式指定:视频流(-c:v
)和音频流(-c:a
)都采用复制模式,不重新编码。ffmpeg -i test.flv -c copy output.mp4
简化写法:-c copy
等价于对所有流(视频、音频等)应用复制模式,与显式指定-c:v copy -c:a copy
效果一致。
注意:若原本音频不是MP3,若转成MP3
音频,需要指定MP3编码器,如libmp3lame
ffmpeg -if test.flv -v:a libmp3lame -vn output_audio_only.mp3
任务 5: 视频转码 (改变编码)
- 目的: 体验真正的编码过程。
- 命令 (H.264 -> H.265/HEVC): ffmpeg -i input.mp4 -c:v libx265 -c:a copy output_h265.mp4
- 观察: 这个过程会明显变慢,你的 CPU 使用率会上升。因为 FFmpeg 正在逐帧解码 H.264,然后再用 libx265 编码器重新编码成 H.265。比较一下 output_h265.mp4 和 input.mp4 的文件大小,通常前者会更小。
任务 6: 改变分辨率 (缩放)
目的: 学会使用 -vf 视频滤镜。
命令 (1080p -> 720p): ffmpeg -i input.mp4 -vf “scale=1280:720” -c:a copy output_720p.mp4
观察: scale 是最常用的滤镜之一。1280:720 是目标分辨率。如果想保持宽高比,可以写成 scale=1280:-1,FFmpeg 会自动计算高度。
ffmpeg
:FFmpeg 主程序,用于音视频处理。-i input.mp4
:-i
指定输入文件为input.mp4
。- `-vf “scale=1280:720” :
-vf
表示视频滤镜(video filter),用于对视频进行处理。scale=1280:720
是缩放滤镜,将视频分辨率强制调整为 1280 像素(宽)×720 像素(高)(即 720P 标准分辨率)。- 注意:如果原始视频的宽高比与 1280:720(16:9)不符,直接使用此参数可能导致画面拉伸。如需保持比例,可改为
scale=1280:-2
(自动计算高度,确保比例不变,-2
表示取偶数避免兼容性问题)。
-c:a copy
:-c:a
表示音频编码器,copy
表示直接复制原始音频流(不重新编码,保留音质且速度快)。output_720p.mp4
:输出文件路径及名称,分辨率为 720P,音频与原文件一致。
注意:滤镜有
1.缩放(scale)调整视频分辨率,支持按比例缩放。 # 缩放到 1280x720(720P) -vf "scale=1280:720" # 按宽度等比缩放(高度自动计算,确保为偶数) -vf "scale=1280:-2" # 按高度等比缩放(宽度自动计算) -vf "scale=-2:720" 2.裁剪(crop)截取视频的部分区域,格式:crop=宽:高:起始X坐标:起始Y坐标。 # 从(100,50)开始,截取 800x600 的区域 -vf "crop=800:600:100:50" # 居中裁剪为正方形(假设原始宽>高) -vf "crop=ih:ih" # ih 表示原始高度,iw 表示原始宽度 3.旋转(rotate)旋转视频画面(单位:弧度或角度,角度需加 deg 后缀)。 # 顺时针旋转 90 度 -vf "rotate=90deg" # 逆时针旋转 45 度 -vf "rotate=-45deg" 4.翻转(flip)水平 / 垂直翻转画面。 # 水平翻转(左右颠倒) -vf "hflip" # 垂直翻转(上下颠倒) -vf "vflip" 5.帧率调整(fps)改变视频帧率(如将 30FPS 转为 24FPS)。 -vf "fps=24" 6.速度调整(setpts)改变播放速度(需配合音频滤镜 atempo 同步音频)。 # 2倍速播放(视频) -vf "setpts=0.5*PTS" # 0.5倍速播放(视频) -vf "setpts=2*PTS" 7.添加水印(overlay)在视频上叠加图片或另一视频(水印),格式:overlay=X坐标:Y坐标。 # 在右上角添加水印(距离右边界20px,上边界20px) -vf "overlay=W-w-20:H-h-20" # W=视频宽度,w=水印宽度;H=视频高度,h=水印高度 # 在中心添加水印 -vf "overlay=(W-w)/2:(H-h)/2" 8.画中画(overlay 进阶)叠加另一个视频作为小窗口。 # 将 input2.mp4 作为小窗口叠加在 input1.mp4 的右下角 ffmpeg -i input1.mp4 -i input2.mp4 -vf "overlay=W-w-10:H-h-10" output.mp4 9.亮度 / 对比度 / 饱和度(eq)调整色彩参数(值范围:0-10,默认 1)。 # 提高亮度(1.2倍),降低对比度(0.8倍) -vf "eq=brightness=0.2:contrast=0.8" 10.灰度化(hue)将彩色视频转为黑白。 -vf "hue=s=0" # s=0 表示饱和度为0 11.锐化 / 模糊(unsharp/blur)增强或减弱画面细节。 # 锐化(强度5,半径1) -vf "unsharp=5:1" # 模糊(半径3, sigma值1) -vf "blur=3:1" 12.添加文本(drawtext)在视频上叠加文字(需指定字体文件路径) # 在左上角添加红色文字(大小24,距离边距10px) -vf "drawtext=fontfile=/path/to/font.ttf:text='Hello':fontsize=24:fontcolor=red:x=10:y=10" 13.嵌入字幕(subtitles)将字幕文件(如 .srt)嵌入视频。 -vf "subtitles=subtitle.srt"
任务 7: 改变码率 (控制清晰度和大小)
- 目的: 学会使用 -b:v 控制视频质量。
- 命令 (压缩视频到 1Mbps): ffmpeg -i input.mp4 -b:v 1M -c:a copy output_1mbps.mp4
- 观察: 1M 代表 1 Mbps (兆比特每秒)。你可以试试 500K (500 Kbps)。码率越低,文件越小,但画面质量(特别是动态场景)会越差,可能会出现马赛克。
ffmpeg
:FFmpeg 主程序,用于音视频处理。-i input.mp4
:-i
指定输入文件为input.mp4
。-b:v 1M
:-b:v
表示视频比特率(video bitrate),1M
表示设置视频流的比特率为 1Mbps(1000kbps)。- 这是一种 “目标比特率” 控制方式,FFmpeg 会尽量将视频平均码率控制在 1Mbps 左右(实际可能有波动)。
-c:a copy
:-c:a
表示音频编码器,copy
表示直接复制原始音频流(不重新编码,保留音质和原始码率)。output_1mbps.mp4
:输出文件路径及名称,视频码率约为 1Mbps,音频与原文件一致。
任务 8: 截取视频片段
- 目的: 学会使用 -ss 和 -t / -to。
- 命令 (从第10秒开始,截取5秒): ffmpeg -i input.mp4 -ss 00:00:10 -t 5 -c copy output_clip.mp4
- 解释: -ss 指定开始时间,-t 指定持续时长。使用 -c copy 会非常快,但可能在非关键帧处截断不精确。如果想精确截取,去掉 -c copy 让其重新编码。
ffmpeg
:FFmpeg 主程序,用于音视频处理。-i input.mp4
:-i
指定输入文件为input.mp4
。-ss 00:00:10
:-ss
表示 “开始时间”,00:00:10
表示从视频的第 10 秒处开始截取(格式为时:分:秒
)。- 若放在
-i
之前(如ffmpeg -ss 10 -i input.mp4 ...
),截取速度会更快(利用关键帧定位),但精度可能稍低;放在-i
之后则精度更高,适合精确截取。
-t 5
:-t
表示 “截取时长”,5
表示截取 5 秒的内容(最终片段时长为 5 秒)。- 也可用
-to
指定结束时间(如-to 00:00:15
表示截取到第 15 秒,与-ss 10 -t 5
效果相同)。
-c copy
:-c
表示编码器,copy
表示直接复制输入文件的音视频流(不重新编码),因此速度极快,且完全保留原始画质音质。output_clip.mp4
:输出文件路径及名称,为截取后的 5 秒视频片段。
任务 9: 视频截图
- 目的: 从视频中抓取一帧作为封面图。
- 命令 (在第5秒截一张图): ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 output_thumbnail.jpg
- 命令从第十秒开始,每隔一秒的第一帧截取一张:ffmpeg -i test.flv -ss 00:00:10 -r 1 -vframes 3 thubm.jpg
- 解释: -vframes 1 表示只处理 1 帧视频就停止。
ffmpeg
:FFmpeg 主程序,用于音视频处理。-i input.mp4
:-i
指定输入文件为input.mp4
。-ss 00:00:05
:-ss
表示 “开始时间”,00:00:05
表示定位到视频的第 5 秒处(精确到秒)。-vframes 1
:-vframes
表示 “视频帧数”,1
表示只截取 1 帧画面(即 1 张图片)。output_thumbnail.jpg
:输出文件路径及名称,格式为 JPG 图片(FFmpeg 会根据扩展名自动选择输出格式)。
任务 10: 添加文字水印
目的: 学习更复杂的 -vf 滤镜链。
命令:
ffmpeg -i input.mp4 -vf "drawtext=text='Hello FFmpeg':fontcolor=white:fontsize=48:x=(w-text_w)/2:y=(h-text_h)/2" -c:a copy output_watermarked.mp4
解释: drawtext 是一个强大的滤镜。这段命令的意思是在视频中央绘制白色的、48像素大小的文字 “Hello FFmpeg”。
任务 11: 视频变速播放
- 目的: 学习使用 setpts 滤镜来改变视频的播放速度。
- 命令 (2倍速播放): ffmpeg -i input.mp4 -vf “setpts=0.5*PTS” -an output_fast.mp4
- 命令 (0.5倍速慢放): ffmpeg -i input.mp4 -vf “setpts=2.0*PTS” -an output_slow.mp4
(注意: 通常改变视频速度后,需要对音频也做相应处理(atempo滤镜),这里为了简化,先用 -an 去掉音频) - 加上音频:ffmpeg -i input.mp4 -vf “setpts=0.5*PTS” -af “atempo=2.0” output_fast.mp4
注意:音频速度范围是0.5到2.0,若是4倍速,则写两遍atempo=2.0即可,逗号隔开:ffmpeg -i input.mp4 -vf “setpts=0.25*PTS” -af “atempo=2.0,atempo=2.0” output_fast.mp4
任务 12: 视频裁剪 (Crop)
目的: 从视频画面中切出一块矩形区域。
命令 (从左上角(0,0)位置,裁剪出 640x360 的区域):
ffmpeg -i input.mp4 -vf “crop=640:360:0:0” -c:a copy output_cropped.mp4
(crop=width:height❌y)-vf "crop=640:360:0:0"
-vf
表示启用视频滤镜,这里使用crop
(裁剪)滤镜,参数格式为crop=宽:高:起始X坐标:起始Y坐标
:640
:裁剪后视频的宽度(像素)。360
:裁剪后视频的高度(像素)。0
(第一个):裁剪的起始点 X 坐标(水平方向,从左向右计算,0
表示最左侧)。0
(第二个):裁剪的起始点 Y 坐标(垂直方向,从上向下计算,0
表示最顶部)。- 效果:从原始视频的左上角(0,0)开始,截取一个 640×360 像素的矩形区域作为输出画面。
任务 13: 视频旋转与翻转
目的: 学习 transpose 滤镜。
命令 (顺时针旋转90度): ffmpeg -i input.mp4 -vf “transpose=1” -c:a copy output_rotated.mp4
-vf "transpose=1"
:-vf
表示启用视频滤镜,transpose=1
是旋转滤镜参数,其中1
代表顺时针旋转 90 度(其他常用值:0
逆时针旋转 90 度,2
逆时针旋转 90 度并翻转,3
顺时针旋转 90 度并翻转)。
命令 (水平翻转): ffmpeg -i input.mp4 -vf “hflip” -c:a copy output_hflip.mp4
命令 (垂直翻转): ffmpeg -i input.mp4 -vf “vflip” -c:a copy output_vflip.mp4
任务 14: 视频合并 (拼接)
目的: 将多个视频文件拼接在一起。这需要先创建一个列表文件。
步骤:
创建 mylist.txt 文件:
file 'input.mp4' file 'output_clip.mp4'
执行拼接命令:ffmpeg -f concat -safe 0 -i mylist.txt -c copy output_concatenated.mp4
-f concat
:-f
指定输入格式,concat
表示使用 “拼接” 格式,用于合并多个媒体文件。-safe 0
:关闭安全检查,允许mylist.txt
中使用绝对路径或不同目录的文件(默认safe=1
只允许相对路径,可能导致路径错误)。-i mylist.txt
:-i
指定输入文件,这里的输入是mylist.txt
(一个文本文件,包含需要拼接的视频文件列表)。
注意:使用此命令拼接的视频文件需满足参数一致(如分辨率、编码格式、帧率等),否则可能拼接失败或播放异常。若参数不一致,需先统一格式再拼接。
任务 15: 生成 GIF 动图
目的: 将视频片段转换为 GIF。
命令 (截取视频前3秒,生成高画质GIF):
ffmpeg -i test.flv -t 3 -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif
(这个滤镜链比较复杂,它的作用是先降低帧率和分辨率,然后生成一个优化的调色板,最后用这个调色板来创建高质量的GIF)
-t 3
:指定只处理视频的前 3 秒(t
表示时长)。-vf "..."
:视频滤镜链,包含多个处理步骤:fps=10
:将帧率设置为 10FPS(每秒 10 帧,降低 GIF 体积)。scale=320:-1:flags=lanczos
:将宽度缩放到 320 像素,高度按比例自动计算(-1
),使用lanczos
算法(高质量缩放)。split[s0][s1]
:将视频流复制为两份,分别标记为[s0]
和[s1]
。[s0]palettegen[p]
:用[s0]
流生成最佳调色板(palettegen
),输出标记为[p]
(解决 GIF 色彩失真问题)。[s1][p]paletteuse
:将[s1]
流与调色板[p]
结合(paletteuse
),生成最终 GIF。
-loop 0
:设置 GIF 无限循环(0
表示无限次,1
表示循环 1 次后停止)。
任务 16: 视频淡入
淡出效果
目的: 学习 fade 滤镜。淡入是从黑到有画面,淡出是从有画面到无画面
命令 (在前2秒淡入,最后5秒淡出):
ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=2,fade=t=out:st=25:d=5" -c:a copy output_faded.mp4
(假设原视频时长30秒, st是开始时间, d是持续时间)
-vf "..."
:视频滤镜链,包含两个淡入淡出效果:fade=t=in:st=0:d=2:添加淡入效果
t=in
:指定为淡入(从黑场逐渐显示画面)。st=0
:淡入开始时间为视频第 0 秒(起始时刻)。d=2
:淡入持续时间为 2 秒(第 0-2 秒完成淡入)。
fade=t=out:st=25:d=5:添加淡出效果
t=out
:指定为淡出(画面逐渐变为黑场)。st=25
:淡出开始时间为视频第 25 秒。d=5
:淡出持续时间为 5 秒(第 25-30 秒完成淡出)。
音频处理 (4 个任务)
任务 17: 替换视频的音轨
- 目的: 将一个视频的音频换成另一个音频文件。
- 命令:
ffmpeg -i input.mp4 -i output_audio.mp3 -c:v copy -map 0:v:0 -map 1:a:0 output_new_audio.mp4
-i input.mp4
:第一个输入文件,提供视频流(0
为该文件的索引)。-i output_audio.mp3
:第二个输入文件,提供音频流(1
为该文件的索引)。-c:v copy
:-c:v
指定视频编码器,copy
表示直接复制input.mp4
的视频流(不重新编码,保留原始画质)。-map 0:v:0
:-map
用于指定输出文件使用的流,这里表示 “使用第 1 个输入文件(0
)的第 1 个视频流(v:0
)”。-map 1:a:0
:表示 “使用第 2 个输入文件(1
)的第 1 个音频流(a:0
)”。output_new_audio.mp4
:输出文件,包含input.mp4
的视频和output_audio.mp3
的音频。
任务 18: 调整音频音量
目的: 学习 volume 音频滤镜。
命令 (音量加倍):
ffmpeg -i input.mp4 -af "volume=2.0" output_louder.mp4
命令 (音量减半):
ffmpeg -i input.mp4 -af "volume=0.5" output_quieter.mp4
volume
是音频音量调节滤镜。2.0
表示将音量放大到原始音量的 2 倍(1.0
为原始音量,0.5
为减半,数值越大音量越大)。
任务 19: 混合两个音轨 (背景音乐)
- 目的: 学习 amerge 和 pan 滤镜,为视频添加背景音乐。
- 命令:
ffmpeg -i input.mp4 -i background_music.mp3 -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map 0:v -map "[a]" -c:v copy -ac 2 output_with_bgm.mp4
(这条命令将视频的原声和背景音乐合并成一个立体声音轨)-i input.mp4
:第一个输入文件(索引为0
),提供原始视频和音频。-i background_music.mp3
:第二个输入文件(索引为1
),提供背景音乐音频。-filter_complex "[0:a][1:a]amerge=inputs=2[a]"
:-filter_complex
用于处理多个流的复杂滤镜(此处处理两个音频流的合并)。[0:a]
表示第一个输入文件的音频流,[1:a]
表示第二个输入文件的音频流。amerge=inputs=2
是音频合并滤镜,inputs=2
表示合并 2 个音频流。[a]
是合并后音频流的临时标签,用于后续映射输出。
-map 0:v
:指定输出文件使用第一个输入文件的视频流(保留原视频画面)。-map "[a]"
:指定输出文件使用前面合并后的音频流[a]
(原音频 + 背景音乐)。-c:v copy
:视频流直接复制(不重新编码,保留原始画质)。-ac 2
:设置输出音频为双声道(立体声,避免合并后可能出现的多声道问题)。
ffmpeg -i test.flv -i test_03.wav -filter_complex "[0:a][1:a]amerge=inputs=2,ac=2[a]" -map 0:v -map "[a]" -c:v copy -c:a libmp3lame -q:a 44 test_whit_wav.flv
任务 20: 音频变速
- 目的: 学习 atempo 滤镜,用于处理音频速度。
- 命令 (音频1.5倍速):
ffmpeg -i input.mp4 -filter_complex “[0:v]setpts=0.66*PTS[v];[0:a]atempo=1.5[a]” -map “[v]” -map “[a]” output_av_fast.mp4
(这里我们同时处理了视频和音频,让它们保持同步)
流媒体与高级操作 (10 个任务)
任务 21: 将视频转为图片序列
- 目的: 将视频的每一帧都保存为一张图片。
- 命令: ffmpeg -i input.mp4 -vf fps=1 thumb%04d.jpg
(fps=1 表示每秒抽一帧, %04d 会生成 thumb0001.jpg, thumb0002.jpg…)
任务 22: 图片序列合成为视频
- 目的: 将一堆有序的图片合成为视频。
- 命令: ffmpeg -framerate 25 -i thumb%04d.jpg -c:v libx264 -pix_fmt yuv420p output_from_images.mp4
任务 23: 为视频添加图片水印 (画中画)
- 目的: 学习 overlay 滤镜。
- 命令 (在左上角 10,10 的位置添加 logo.png):
ffmpeg -i input.mp4 -i logo.png -filter_complex “overlay=10:10” -c:a copy output_logo_overlay.mp4
任务 24: 视频去抖动
- 目的: 学习 deshake 滤镜,修复手持拍摄的抖动画面。
- 命令: ffmpeg -i shaky_video.mp4 -vf deshake output_stable.mp4
任务 25: 视频降噪
- 目的: 学习 hqdn3d 滤镜,去除视频中的噪点。
- 命令: ffmpeg -i noisy_video.mp4 -vf hqdn3d output_denoised.mp4
任务 26: 强制设置视频帧率
- 目的: 学习 -r 参数。
- 命令 (将视频帧率强制改为 25 fps): ffmpeg -i input.mp4 -r 25 -c:a copy output_25fps.mp4
任务 27: 制作 HLS 切片
目的: 亲手制作 HLS 直播/点播所需的 .m3u8 和 .ts 文件。
命令:
mkdir hls ffmpeg -i input.mp4 -c:a aac -c:v libx264 -hls_time 10 -hls_list_size 0 -hls_segment_filename "hls/file%03d.ts" hls/playlist.m3u8
(-hls_time 10 表示每个切片10秒, -hls_list_size 0 表示保留所有切片)
任务 28: 录制桌面
- 目的: 学习如何从设备输入(而不只是文件)。
- 命令 (Linux, 使用 x11grab): ffmpeg -f x11grab -video_size 1920x1080 -i :0.0 -c:v libx264 -preset ultrafast output_desktop.mkv
- 命令 (Windows, 使用 gdigrab): ffmpeg -f gdigrab -i desktop -c:v libx264 -preset ultrafast output_desktop.mkv
任务 29: 模拟推流到 RTMP 服务器
- 目的: 练习 -re 参数,模拟真实推流。
- 命令: ffmpeg -re -i input.mp4 -c copy -f flv rtmp://your_rtmp_server/live/stream
(-re 参数会以视频的原始帧率读取文件,否则 FFmpeg 会以最快速度把文件读完并推送)
任务 30: 查看实时码率和调试信息
目的: 学习如何获取 FFmpeg 的实时处理信息。
命令: 在任何一个转码命令后面加上 -progress - 或 -v debug 参数,观察终端输出的详细信息。
ffmpeg -i input.mp4 -b:v 1M output.mp4 -progress progress.txt-progress progress.txt
:指定将转码进度信息输出到progress.txt
文件中,包含以下内容:
- 已处理时间(
out_time
) - 比特率(
bitrate
) - 帧率(
fps
) - 完成百分比(
progress=continue
表示正在处理,progress=end
表示完成)
- 已处理时间(