ffmpeg
官方文档:https://ffmpeg.org/ffmpeg.html#Synopsis
ffprobe#
ffprobe查询音视频信息(时长、编解码方式、分辨率)
https://blog.csdn.net/JineD/article/details/124760777
ffprobe a.wav
-c#
-c (-codec) 指定编码器
ffmpeg -i video.webm -c:a aac -c:v h264 video.mp4
-c:a 指定音频编码 -c:a aac 指定音频为 aac
-c:v 指定视频编码 -c:v h264 指定视频为 h264
-c:a copy 直接复制 音频编码
-c:v copy 直接复制 视频编码
-c copy 直接复制音频视频编码
-map#
https://blog.csdn.net/JineD/article/details/124741859
top 命令不使用任何流说明符。这是一种绝对的映射方法,无论类型如何,都会选择特定的流。
-map 0:0 第一个输入文件的第一个流
-map 1:3 第二个输入文件的第四个流
bottom 命令包括流说明符(v视频, a音频, s字幕, m元数据)以将流限制为特定类型。
-map 0✌️0 第一个输入文件的第一个视频流
-map 1🅰️2 第二个输入文件的第三个音频流
-map 1:s:1 第二个输入文件的第二个字幕流
-filter#
ffmpeg命令行工具提供了滤镜的语法格式,格式如下:
ffmpeg <-filter/vf/-af/-filter_complex> filtergraph
- -filter/-vf/-af/-filter_complex代表ffmpeg命令行工具将使用滤镜功能,其中-filter代表使用简单的音视频滤镜。-vf/-af 代表使用简单的音/视频滤镜 ;-filter_complex代表使用复杂的音视频滤镜
- filtergraph 代表滤镜管道的语法,滤镜管道由至少一个滤镜链组成(多个滤镜链之间用";"分隔),每个滤镜链仅且必须代表一条输出链;每一个滤镜链由至少一个滤镜组成(多个滤镜之间用","分隔)。每一个滤镜的语法格式如下:
[in_link_1]...[in_link_N]filter_name[@id]=arguments[out_link_1]...[out_link_M]
https://blog.csdn.net/xian0710830114/article/details/130921272
-ac#
ffmpeg -i a.mp4 -ac 1 output.flv
这里的输入文件是双声道,这条命令是把双声道转成单声道。
https://zhuanlan.zhihu.com/p/609923196?utm_id=0
https://zhuanlan.zhihu.com/p/486693498?utm_id=0
-shortest#
-shortest参数是ffmpeg的一个选项,用于在转换过程中使得音频流或视频流停止的时间点等于较短的输入流的时间点。 也就是说,它可以保证在转换过程中,所有音频或视频都会停止,而不会继续播放没有内容的静默或空白时间。 使用-shortest参数很简单,只需要在输入文件和输出文件之间添加即可。例如,下面是一个使用-shortest参数的命令:
ffmpeg -i input.mp4 -i input.wav -shortest output.mp4
-y#
ffmpeg -i input.mp4 -y output.mp4
如果 output.mp4 已经存在,ffmpeg 会自动覆盖它
拼接音频#
# contact:123.mp3|124.mp3代表着需要连接到一起的音频文件
ffmpeg -i input1.mp3 -i input2.mp3 -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" output.mp3
ffmpeg -i 1.wav -i 2.wav -i 3.wav ...... -i {n}.wav -filter_complex '[0:0][1:0]......[{n-1}:0]concat=n={n}:v=0:a=1[out]' -map '[out]' final.wav
# -acodec copyoutput.mp3重新编码并复制到新文件中
ffmpeg -i "concat:123.mp3|124.mp3" -acodec copy output.mp3
混合音频#
ffmpeg -i 124.mp3 -i 123.mp3 -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f mp3 remix.mp3
-i代表输入参数
-filter_complex
amix是混合多个音频到单个音频输出
inputs=2代表是2个音频文件,如果更多则代表对应数字
duration 确定最终输出文件的长度
longest(最长)|shortest(最短)|first(第一个文件)
dropout_transition
The transition time, in seconds, for volume renormalization when an input stream ends. The default value is 2 seconds.
-f mp3 输出文件格式
https://www.zhihu.com/question/573371565?utm_id=0
ffmpeg -i 1.mp3 -i 2.mp3 -filter_complex amerge -ac 2 -c:a libmp3lame -q:a 4 output.mp3
-ac:设定声音的channel数
-c:a:指定音频编码器
libmp3lame:mp3音频编码器
-q:a:表示输出的音频质量,一般是1到5之间(1 为质量最高)
提取视频里的音频#
无损提取
ffmpeg -i input.mp4 -c:a copy -map a output.mp3
-map a:只提取音频流。
-c:a copy: 指定音频编码器为 copy,这意味着不会重新编码音频流,而是直接拷贝音频数据,保持音质不变
output后缀名不影响具体音频封装格式
提取&转码
ffmpeg -i input.mp4 -ac 1 -ar 16000 output.wav
音频转WAV#
# 自动根据输入文件的参数设置输出 WAV 文件的采样率和声道数
ffmpeg -i input output.wav
# 转码
ffmpeg -i input [-ac 2] [-ar 44100] [-acodec pcm_s16le] output.wav
input可以是任一封装格式的音频
pcm_s16le:位深16bit小端。WAV文件默认编码-acodec可不写。
-ar 44100:采样率
-ac 2:声道数
比特率 = 采样率 × 位深度 × 声道数。对于一个立体声(2声道)和16-bit深度、44.1 kHz采样率的WAV文件:比特率 = 44,100 Hz × 16 bit × 2 = 1,411,200 bps(约合 1,411 kbps)
音频降采样#
ffmpeg -i output.wav -ar 16000 output_mono.wav
压缩视频#
- 兼容性:MP4 是最为通用的格式,适合大多数设备和平台。MOV 多用于Apple设备,WMV 则主要适用于Windows。
- 视频质量与文件大小:MOV 提供高质量但文件较大,MP4 提供良好的质量与较小的文件大小,WMV 适合压缩,但在质量上可能稍逊。
ffmpeg -i src_video.[mp4/mov/wmv] -vcodec libx264 -crf 18 -preset slow -acodec aac -b:a 192k output_video.[mp4/mov/wmv]
- -vcodec libx264:使用H.264编码。
- -crf 18:设置恒定质量控制。一般来说,18-23是较好的范围,数字越小,画质越好,文件越大。建议使用18以保持很高的画质。
- -preset slow:编码速度的预设。slow会比fast等其他选项进行更复杂的压缩,从而通常能达到更小的文件大小和更高的画质。可以根据需要选择medium或fast。
- -acodec aac:使用AAC音频编码。
- -b:a 192k:设置音频比特率为192kbps。
其他场景
http://www.360doc.com/content/23/0710/02/1087971890_1087971890.shtml
ffmpeg -i output_tmp.wmv -b:v 500k -s 960x540 output_preview.wmv
链接下载音视频#
# m3u8链接下载视频
ffmpeg -i "xxx.m3u8?xxx" -c copy movie.mp4
# mp4链接下载视频
wget "xxx.mp4?xxx" -O movie.mp4
# m3u8链接下载音频
ffmpeg -i "xxx.m3u8?xxx" output.wav
音量调整#
# 降低音量
ffmpeg -i org.wav -filter:a "volume=-12dB" org_final.wav
# 配音加音量
ffmpeg -i 1498364870_vi_voice.wav -filter:a "volume=6dB" vocal_final.wav
时间戳裁剪音视频#
ffmpeg -i hua-01.wmv -to '442.83' hua-01-c.wmv
ffmpeg -i output_preview.wmv -ss 00:00:00 -t 600 -c copy start_10_min.wmv
ffmpeg -i 'xxx.wav?xxx' -ss 00:00:02.360 -to 00:00:17.800 -c copy tt.wav
混合音视频#
ffmpeg -i video -i audio -c:v copy -map 0:v -map 1:a output
video和output视频编码格式相同
-c copy -map 0:v -map 1🅰️0
-c:v copy -c:a aac -map 0:v -map 1:a
区别:
这两条命令的主要区别在于音视频编解码和映射选项的使用:
- 编解码器选项:
-
- -c copy 和 -c:v copy:
-
-
- -c copy 是一个全局选项,表示复制所有流的编解码器,而 -c:v copy 明确表示仅复制视频流的编解码器。
-
-
- -c:a aac:
-
-
- 这个选项表示对音频流使用 AAC 编解码器。
-
- 映射选项:
-
- -map 0:v:
-
-
- 表示从输入文件 0 中映射所有视频流。这在两个命令中是相同的。
-
-
- -map 1🅰️0 和 -map 1:a:
-
-
- -map 1🅰️0 表示从输入文件 1 中映射第一个音频流,而 -map 1:a 会映射所有音频流。在这里,如果输入文件 1 只有一个音频流,那两者实际上会产生相同的结果。
-
总结:
- 第一条命令会简单地复制视频流,并从第二个输入文件中复制音频流(如果有的话),而不改变音频编解码器。
- 第二条命令会复制视频流,并将第二个输入文件中的音频流转换为 AAC 格式。
因此,适用场景可能不同,选择取决于你是否需要对音频流进行重新编码。
混合字幕#
ffmpeg -y -i hjxs.wmv -vf ass=tmp.ass hjxs_preview.wmv
# Mac环境
ffmpeg -i src.wmv -lavfi "subtitles=zh.srt:fontsdir=/System/Library/Fonts/:force_style='FontName=宋体,Alignment=2,MarginV=35'" -vcodec h264 -b:v 0 output.wmv
# Linux环境(将Songti.ttc上传到/usr/share/fonts/处)
ffmpeg -i src.mp4 -lavfi "subtitles=tt.srt:fontsdir=/usr/share/fonts/:force_style='FontName=宋体,Alignment=2,MarginV=5,Spacing=4'" -c:a copy output.mp4
提取视频里的某帧#
ffmpeg -i zhenhuan_01_720p.mp4 -ss 00:18:42.840 -frames:v 1 img/frame720_tmp.jpg
按照区域裁剪图片#
ffmpeg -i img/frame720_1.jpg -vf "crop=400:60:250:400" img/frame720_crop_1.jpg
视频绘制线条或矩形框#
ffmpeg -i input.mp4 -vf "drawline=x1=y1=x2=y2=color=red thickness=5" -c:a copy output.mp4
# ● x1 和 y1 是线的起点坐标
# ● x2 和 y2 是线的终点坐标
# ● color 是线的颜色(可以使用十六进制颜色值或颜色名称)
# ● thickness 是线的宽度
ffmpeg -i input.mp4 -vf "drawbox=x=50:y=50:w=200:h=100:color=red:t=5" -c:a copy output.mp4
# ● x 和 y 是矩形左上角的坐标
# ● w 和 h 是矩形的宽度和高度
# ● color 是矩形的颜色
# ● t 是矩形的边框厚度(可以为 fill 以填充整个矩形)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构