基本参数
表格1:主要参数
参数 | 说明 |
---|---|
-i | 设定输入流 |
-f | 设定输出格式(format) 高于后缀名 |
-ss | 开始时间 |
-t | 时间长度 |
codec | 编解码 |
表格2:音频参数
参数 | 说明 |
---|---|
-aframes | 设置要输出的音频帧数 |
-f | 音频帧深度 |
-b:a | 音频码率 |
-ar | 设定采样率 |
-ac | 设定声音的Channel数 |
-acodec | 设定声音编解码器,如果用copy表示原封不动的复制音频流 |
-an | 不处理音频 |
-af | 音频过滤器 |
表格3:视频参数
参数 | 说明 |
---|---|
-pix_fmt | 提取像素格式 |
-vframes | 设置要输出的视频帧数 |
-framerate | 视频帧率(更多用于与 FFmpeg 的过滤器配合使用,特别是在处理视频时需要指定帧率的场景。) |
r | 显式地设置输出视频的帧率 |
-b | 设定视频码率 |
-s | 指定视频分辨率->直接处理原始视频帧或图像序列 |
video_size | 某些特定的 FFmpeg 过滤器或输出格式中更常见,尤其是在处理封装格式(如 MP4、AVI 等)时。 |
-b:v | 视频码率 |
-vn | 不处理视频 |
-aspect | aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777 |
-vcodec | 设定视频编解码器,如果用copy表示原封不动的复制视频流 |
-vf | 视频过滤器 |
-vbsf | 用于指定视频比特流过滤器(video bitstream filter)。比特流过滤器主要用于在不进行实际解码和重新编码的情况下对视频数据流进行处理和修改。这可以包括修复损坏的数据流、重新组织数据包、或者执行其他比特流级别的操作。 |
实战基本参数
提取音视频
- 保留封装格式
-
- 音频
ffmpeg -i .\test.mp4 -acodec copy -vn audio.mp4
- 音频
注解:只有音频 视频显示波形
-
- 视频
ffmpeg -i .\test.mp4 -vcodec copy -an video.mp4
- 视频
无声音
- 提取视频()
第一要查看输入视频的编解码协议
第二要查看编解码协议的编解码器
ffmpeg -codecs |findstr h264(windows 系统)
一般最右边括号里面选一个就行 一般第一个
ffmpeg -codecs |grep h264(linuxs系统)
-
- 保留格式(查看编码)
ffmpeg -i .\test.mp4 -vcodec copy -an test_copy.h264
- 保留格式(查看编码)
-
- 强制格式(改变编码)
ffmpeg -i .\test.mp4 -vcodec libx264 -an test.h264
- 强制格式(改变编码)
-
- 音频
-
- 保留格式
ffmpeg -i .\test.mp4 -acodec copy -vn test_copy.aac
- 保留格式
-
- 强制格式
ffmpeg -i .\test.mp4 -acodec aac -vn test.aac
- 强制格式
封装命令
- 保持编码格式
ffmpeg -i test.mp4 -codec copy test_copy2.ts
- 改变编码格式
ffmpeg -i test.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.mkv
-修改帧率
ffmpeg -i test.mp4 -r 15 output2.mp4
-修改视频码率
ffmpeg -i test.mp4 -b:v 400k output_bvflv - 修改音频码率:
ffmpeg -i test.mp4 -b:a 192k output_ba.mp4 - 修改音视频码率:
ffmpeg -i test.mp4 -b:v 400k -b:a 192k output_bva.mp4
修改视频分辨率: - ffmpeg -i test.mp4 -s 480x270 output_480x270.mp4
修改音频采样率: - ffmpeg -i test.mp4 -ar 44100 output_44100hz.mp4
一个视频质量由码率 分辨 帧数决定 音频为 音频采样率(一般由决定音频帧) 音频码率 音频深度(分辨率) 通道数
提取和播放数据
提取YUV
- 提取3秒数据,分辨率转为320x240
ffmpeg -i test.mp4 -t 3 -pix_fmt yuv420p -s 320x240 yuv420p_320x240.yuv
提取RGB
- 提取3秒数据,分辨率转为320x240
ffmpeg -i test.mp4 -t 3 -pix_fmt rgb24 -s 320x240 rgb24_320x240.rgb
提取PCM
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f s16le 48000_2_f16le.pcm
RGB和YUV之间的转换
ffmpeg -s 320x240 -pix_fmt yuv420p -i yuv420p_320x240.yuv -pix_fmt rgb24 rgb24_320x240_2.rgb
播放YUV数据
ffplay -pixel_format yuv420p -video_size 320x240 -framerate 5 yuv420p_320x240.yuv
播放RGB数据
ffplay -pixel_format rgb24 -video_size 320x240 -framerate 5 -i rgb24_320x240.rgb
播放PCM数据
ffplay -ar 48000 -ac 2 -f s32le 48000_2_s32le.pcm
过滤器参数
裁剪和拼接 (推荐用ts格式)
ffmpeg -i 1.mp4 -codec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 2.mp4 -codec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i 3.mp4 -codec copy -vbsf h264_mp4toannexb 3.ts
- 拼接(用字符串)
(1)ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out_ts.mp4
(2)ffmpeg -f concat -i list.txt -codec copy out_ts2.mp4
这个txt文件为
file '1.ts'
file '2.ts'
file '3.ts'
对于音视频参数不一样的情况
视频分辨率可以不同,但是编码格式需要统一。
音频编码格式需要统一,音频参数(采样率/声道等)也需要统一。
图片和视频
- 单独帧情况(关于动图 后缀名你设置)
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.jpg
-i:指定输入文件。
-y:覆盖输出文件。
-f image2:指定输出格式为图片。
-ss:指定起始时间(00:00:02 表示从视频的第2秒开始)。
-vframes 1:指定截取1帧。
-s:指定输出图片的分辨率(640x360)
-
- (关于动图 后缀名你设置)
你得额外指定-t -r 后缀名为.git
ffmpeg -i test.mp4 -t 5 -s 640x360 -r 15 test.gif
- (关于动图 后缀名你设置)
- 多帧
ffmpeg -i test.mp4 -t 5 -s 640x360 -r 15 frame%03d.jpg
-t 5:指定处理视频的时长(5秒)(持续时长)。不指定 就是整个视频
-s 640x360:指定输出图片的分辨率。
-r 15:指定帧率(每秒15帧)。
frame%03d.jpg:指定输出文件名格式,%03d 表示帧编号,从001开始 C语言的风格
- 多帧转为图片
ffmpeg -f image2 -i frame%03d.jpg -r 25 video.mp4
-f image2:指定输入格式为图片序列。
图片裁剪
基本语法:crop=ow:oh:x:y :keep_aspect
ow(output width):指定输出视频的宽度。
oh(output height):指定输出视频的高度。
x:裁剪区域左上角的 X 坐标(相对于输入视频的左上角)。
y:裁剪区域左上角的 Y 坐标(相对于输入视频的左上角)。
keep_aspect 是一个可选参数,用于保持原始视频的宽高比。
ffmpeg -i input.mp4 -filter:v "crop=640:360:640:360" output.mp4
这个命令会从原始视频的中间位置(640, 360)开始裁剪出一个 640x360 的视频区域。
文字水印
ffmpeg -i input.mp4 -vf "drawtext=fontsize=100/fontfile=FreeSerif.ttf/text='hello world'/fontcolor=green:box=1:boxcolor=yellow"
-i input.mp4:指定输入文件是 input.mp4。
-vf:指定对视频帧应用的视频滤镜(video filter)。
drawtext=fontsize=100:设置文本水印的字体大小为 100。
fontfile=FreeSerif.ttf:指定用于文本水印的字体文件是 FreeSerif.ttf。这个字体文件需要在你的系统中可用,或者提供它的完整路径。
text='hello world':设置文本水印的内容为 'hello world'。
fontcolor=green:设置文本水印的颜色为绿色。
box=1:指定为文本水印绘制一个边框。
boxcolor=yellow:设置文本水印边框的颜色为黄色。
图片水印
ffmpeg -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark] overlay=10:10[out]" output.mp4
-i input.mp4:指定输入文件为 input.mp4。
-vf:指定对视频帧应用的视频滤镜链。
movie=logo.png[watermark]:加载名为 logo.png 的图片文件,并将其引用名称设置为 watermark。
in\]\[watermark\] overlay=10:10\[out\]: \[in\]:表示输入视频流。 \[watermark\]:表示加载的图片水印。 overlay:指定将水印叠加到视频流上。 =10:10:设置水印的起始位置,x 坐标为 10,y 坐标为 10。 \[out\]:指定叠加后的视频流名称。
ffplay -i input.mp4 -vf " movie=logo.png[watermark];[in][watermark]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*0.7[out]"
movie=logo.png[watermark]:加载 logo.png 图片文件,并将其引用名称设置为 watermark。
in\]\[watermark\]overlay=x=mod(50*t,main_w):y=abs(sin(t))*0.7\[out\]: in:表示输入视频流。 watermark:表示上面加载的图片水印。 overlay:将水印图片叠加到视频流上。 x=mod(50*t,main_w):设置水印的 x 坐标,使其在视频宽度内按时间 t (以秒为单位)进行周期性移动。mod(50* t,main_w) 表示水印每 50 秒移动一个视频宽度的距离。 y=abs(sin(t))\*0.7:设置水印的 y 坐标,使其根据正弦函数 sin(t) 的值在视频高度的 0.7 倍范围内上下波动。 out:指定叠加后的输出视频流。
- 画中画
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20[out]"
-i input.mp4:指定输入文件是 input.mp4。
-vf:指定对视频帧应用的视频滤镜链(video filtergraph)。
movie=sub_320x240.mp4[sub]:加载名为 sub_320x240.mp4 的视频文件,并将其引用名称设置为 sub。这个子视频将被用作水印或覆盖层。
in\]\[sub\]overlay=x=20:y=20:将输入视频流(\[in\])和子视频流(\[sub\])进行叠加(overlay)。x=20 和 y=20 参数指定了子视频在主视频上的起始位置,即子视频左上角的 x 坐标为 20,y 坐标为 20。 \[out\]:指定叠加后的视频流名称,用于输出。