视频格式转换
1、命令:ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件]
2、格式:
- h264: 表示输出的是h264的视频裸流
- mp4: 表示输出的是mp4的视频
- mpegts: 表示ts视频流
1、分别提取音频、视频
1、提取视频
//保留封装格式
ffmpeg -i test.mp4 -vcodec copy -an video.mp4--提取视频(去除音频轨)
//保留编码格式(MP4中视频为h264编码)
ffmpeg -i test.mp4 -vcodec copy -an test_copy.h264--提取视频(去除音频轨)
//强制转换编码格式(MP4中视频为非h264编码转为h264编码)
ffmpeg -i test.mp4 -vcodec libx264 -an test.h264--提取视频(去除音频轨)
2、提取音频
//保留封装格式
ffmpeg -i test.mp4 -acodec copy -vn audio.mp4--提取音频(去除视频轨)
//保留编码格式(MP4中音频为aac编码)
ffmpeg -i test.mp4 -vcodec copy -an test_copy.h264--提取音频(去除视频轨)
//强制转换编码格式(MP4中音频为非mp3编码转为mp3编码)
ffmpeg -i test.mp4 -vcodec libx264 -an test.h264--提取音频(去除视频轨)
2、修改视频格式/封装
1、截取视频固定时长内容
//-i:输入流;-ss:开始(截取)时间;-t:时间长度(截取10s)
//如果音视频格式不统一则强制统一为 -vcodec libx264 -acodec aac
ffmpeg -i 沙海02.mp4 -ss 00:05:00 -t 10 -codec copy 1.mp4
2、MP4–>ts
//保持编码格式
ffmpeg -i test.mp4 -vcodec copy -acodec copy test_copy.ts
ffmpeg -i test.mp4 -codec copy test_copy2.ts
//使用bitstream filter处理
ffmpeg -i 1.mp4 -codec copy -vbsf h264_mp4toannexb 1.ts
//分离某些封装格式(例如MP4/FLV/MKV等)中的H.264的时候,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS而无法播放。
//H.264码流的SPS和PPS信息存储在AVCodecContext结构体的extradata中。需要使用ffmpeg中名称为“h264_mp4toannexb”的bitstream filter处理。
//最简单粗暴方法,只考虑格式转换
ffmpeg -i input.mp4 output.ts
3、MP4–>flv
//保持编码格式
ffmpeg -i 1.mp4 -codec copy 1.flv
ffmpeg -i test.mp4 -acodec copy -vcodec copy -f flv output.flv
4、MP4–>avi
ffmpeg -i test.mp4 output.avi
5、MP4–>mov
ffmpeg -i test.mp4 output.mov
6、MP4–>mkv
//改变编码格式
ffmpeg -i test.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.mkv--改变编码器:libx265->libmp3lame
//修改视频码率:-b:v设置视频码率,修改视频码率为400k(降低清晰度)
ffmpeg -i test.mp4 -b:v 400k output_bv.mkv--音频也被重新编码
7、MP4–>mpg
ffmpeg -i test.mp4 output.mpg //清晰度会下降很多
//MPEG4-->H264;-vcodec:设定视频编解码器为H264
ffmpeg -i input.mpg -vcodec h264 output.mpg
8、MP4–>gif
//-i:输入流;-t:时间;-r帧率(默认为25);-s:画面宽高;
ffmpeg -i test.mp4 -t 5 -r 1 image1.gif
ffmpeg -i test.mp4 -t 5 -r 25 -s 640x360 image2.gif
9、MP4–>3pg
ffmpeg -i test.mp4 -s 176x144 -vcodec h263 -r 25 -b 12200 -ab 12200 -ac 1 -ar 8000 output.3gp
10、3pg–>flv
ffmpeg -i test.3gp -f avi -vcodec xvid -acodec mp3 -ar 22050 output.avi
11、ts–>MP4
ffmpeg -i test.ts -acodec copy -vcodec copy -f mp4 output.mp4
12、flv–>MP4
//flv-->MP4直接转画质无下降
ffmpeg -i test.flv (-vcodec copy -acodec copy) output.mp4
13、flv–>avi
// H.264 bitstream malformed, no startcode found, use the video bitstream filter 'h264_mp4toannexb' to fix it ('-bsf:v h264_mp4toannexb' option with ffmpeg)
ffmpeg -i 茄汁烧豆腐.flv -vcodec copy -acodec copy -bsf:v h264_mp4toannexb 茄汁烧豆腐.avi
//简单粗暴,直接转,画质很模糊
ffmpeg -i 茄汁烧豆腐.flv 茄汁烧豆腐1.avi
14、flv–>3pg
ffmpeg -i test.flv -s 176x144 -vcodec h263 -r 25 -b 200 -ab 64 -acodec mp3 -ac 1-ar 8000 output.3gp
15、avi–>MP4
//-map 0 从输入索引 #0(第一个输入)中选择所有流
ffmpeg -i test.avi -c copy -map 0 output.mp4
16、avi–>3pg
ffmpeg -i test.avi -s aqif -vcodec -acodec mp3 -ac 1 -ar 8000 -r 25 -ab 32 -y output.3gp
17、mov–>MP4
ffmpeg -i test.mov output.mp4
18、mkv–>MP4
//-y:不经过确认,输出时直接覆盖同名文件。
ffmpeg -i obj.mkv -y -vcodec copy -acodec copy output.mp4
19、mkv–>avi
ffmpeg -i test.mkv -vcodec copy -acodec copy output.avi
20、mpg–>mxf
ffmpeg -i input.mpg -vcodec mpeg2video -acodec pcm_s16le -ar 48000 -ac 2 output.mxf
21、GIF–>mp4
ffmpeg -f gif -i image2.gif image2.mp4
22、H264–>mp4
ffmpeg-i test.h264-vcodec copy-fmp4 output.mp4
23、H264–>ts
ffmpeg-i test.h264-vcodec copy-f mpegts output.ts
24、3pg–>flv
ffmpeg -i test.3gp -f avi -vcodec xvid -acodec mp3 -ar 22050 output.avi
3、修改视频编码格式
1、MPEG4编码转成H264编码
//MPEG4-->H264;-vcodec:设定视频编解码器为H264
ffmpeg -i input.mp4 -vcodec h264 output.mp4
ffmpeg -i input.mp4 -strict -2 -vcodec h264 output.mp4
2、H264编码转成MPEG4编码
//H264-->MPEG4;-vcodec:设定视频编解码器为MPEG4
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4
ffmpeg -i input.mp4 -strict -2 -vcodec mpeg4 output.mp4
4、修改参数
1、修改帧率
//-r设置帧速率,修改视频帧率为15
ffmpeg -i test.mp4 -r 15 -codec copy output.mp4
ffmpeg -i test.mp4 -r 15 output2.mp4
2、仅修改视频码率
//修改视频码率:-b:v设置视频码率,修改视频码率为400k,将视频文件变小又不破坏分辨率
ffmpeg -i test.mp4 -b:v 400k output_bv.mkv--音频也被重新编码
3、仅修改音频码率
//修改音频码率:-b:a设置音频码率,修改音频码率为192k
ffmpeg -i test.mp4 -b:a 192k output_ba.mp4--视频也被重新编码
//若不想视频重新编码,需要加上-vcodec copy
ffmpeg -i test.mp4 -vcodec copy -b:a 192k output_ba.mp4
4、修改音视频码率
ffmpeg -i test.mp4 -s 480x270 output_480x270.mp4
5、修改视频分辨率
//-s设置画面的宽高:480×270
ffmpeg -i test.mp4 -s 480x270 output_480x270.mp4
//使用过滤器改变:将输入的1920x1080缩小到960x540输出;-vf:视频过滤器
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
//如果540不写,写成-1,即scale=960:-1, 那也是可以的,ffmpeg会通知缩放滤镜在输出时保持原始的宽高比
//–aspect 16:9:宽高比为16:9
6、修改音频采样率
//-ar设置采样率:44100(hz)
ffmpeg -i test.mp4 -ar 44100 output_44100hz.mp4
音频格式转换
1、视频–>音频
1、mp4–>mp3
//-i: 表示输入的音频或视频;-acodec: 设定声音编解码--libmp3lame;-ac:设置声音的channel数,通道数默认为1;-ar:设置音频采样率
ffmpeg -i $ID.mp4 -acodec libmp3lame -ac 1 -ar 16000 $ID.mp3
//-i: 表示输入的音频或视频;-vn: 不做视频记录;-ab: bitrate 设置音频码率(=-b:a)
ffmpeg -i $ID.mp4 -vn -ab 128k -ar 16000 -y $ID.mp3
2、mp4–>wav
//-ac:设置声音的channel数,通道数默认为1;-ar:设置音频采样率
ffmpeg -i $ID.mp4 -ac 1 -ar 16000 $ID.wav
2、音频–>音频
1、wav–>mp3
//-f:强制使用某种输出格式,通常输入文件的格式是自动检测的,输出文件的格式根据后缀猜测,所以大多数情况不需要设置 -f
ffmpeg -i input.wav -vn -ar 44100 -ac 2 -ab 192k -f mp3 output.mp3
ffmpeg -i audio.wav -acodec libmp3lame audio.mp3
2、wav–>flac
ffmpeg -i input.wav output.flac
3、wav–>ogg
ffmpeg -i input.aac -libvorbis output.ogg
4、wav–>aac
ffmpeg -i input.wav -acodec libfaac output.aac
5、wav–>ac3
ffmpeg -i input.wav -acodec ac3 output.ac3
6、wav–>amr
ffmpeg -i XXX.wav -acodec libamr_nb -ab 12.2k -ar 8000 -ac 1 XXX.amr
7、wav–>pcm
ffmpeg -i xxx.wav -acodec pcm_s16le -f s16le -ac 1 -ar 16000 xxx.pcm
8、aac–>wav
ffmpeg -i audio.aac audio.wav
9、aac–>mp3
ffmpeg -i audio.aac -acodec libmp3lame -ac 2 -ab 160 audio.mp3
10、aac–>ogg
ffmpeg -i input.aac -libvorbis output.ogg
11、aac–>ac3
ffmpeg -i audio.aac -acodec ac3 audio.ac3
12、mp3–>wav
ffmpeg -i XXX.mp3 -f wav XXX.wav
13、mp3–>pcm
//自定义格式:采样率16000hz,分辨率16bits,单声道
ffmpeg -i xxx.mp3 -acodec pcm_s16le -f s16le -ac 1 -ar 16000 xxx.pcm
14、mp3–>ogg
ffmpeg -i xxx.mp3 -acodec libvorbis -ab 128k xxx.ogg
15、flac–>wav
ffmpeg -i input.flac output.flac
小结:
wav, mp3, aac, ac3, ogg之间的互相转换是相似的:
输出是mp3: -acodec libmp3lame
输出是aac: -acodec libfaac
输出是ac3: -acodec ac3
输出是ogg: -acodec libvorbis
至于其他参数选项,视需求使用。
图片格式转换
1、图片转图片
1、webp–>jpg
ffmpeg -i in.webp out.jpg
2、webp–>png
ffmpeg -i in.webp out.png
3、jpg–>png
ffmpeg -i in.jpg out.png
4、jpg–>webp
ffmpeg -i in.jpg out.webp
5、png–>webp
ffmpeg -i in.png out.webp
6、png–>jpg
ffmpeg -i in.png out.jpg
2、图片裁剪
ffmpeg -i image_source -vf crop=width:height:from_x:from_y out_source
#width是要裁剪出的图片的宽度
#height是要裁剪出的图片的高度
#from_x是裁剪的起始X轴的位置
#from_y是裁剪的起始Y轴的位置
#如果不指定from_x和from_y表示从原始图片中心位置开始裁剪
3、添加水印图片
ffmpeg -i image_source -vf movie=logo_source,scale=logo_width:logo_height,lut=a=val*opacity_num[watermask];[in][watermask] overlay=from_x:from_y[out] -y out_source
#logo_source为水印图片地址
#logo_width为水印图片的宽度
#logo_height为水印图片的高度
#opacity_num为水印图片的透明度
#from_x为水印的起始X轴的位置
#from_y为水印的起始Y轴的位置
4、添加文字水印
ffmpeg -i image_source -vf drawtext=fontfile=font_ttf_path:fontcolor=font_color:fontsize=font_size:text=message_info:x=from_x:y=from_y out_source
#font_ttf_path为字体路径,此项必须设置否则会出现字体无法找到的错误;
#字体路径要设置绝对路径并且要注意路径正反斜线转义(例如C\\:/Windows/Fonts/simhei.ttf)
#font_color为字体的颜色
#font_size为字体的大小
#message_info为水印文字内容
#from_x为水印的起始X轴的位置
#from_y为水印的起始Y轴的位置
#如果水印内容是中文需要设置中文字体否则会文字显示乱码
5、图片旋转指定的角度
ffmpeg -i image_source -vf rotate=route_num*PI/180 -y out_source
#route_num是要旋转的角度
#当route_num大于0的时候顺时针旋转,当route_num小于0的时候逆时针旋转
6、图片旋转特殊简便命令
上面的命令理论上可以完成所有的图片旋转操作,但ffmpeg仍然存在特殊简便旋转命令
ffmpeg -i image_source -vf transpose=route_number -y out_source
#route_number=0顺时针旋转90度再左右镜像
#route_number=1顺时针旋转90度
#route_number=2逆时针旋转90度
#route_number=3逆时针旋转90度再左右镜像
7、图片左右镜像
ffmpeg -i image_source -vf hflip out_source
8、将图片上下镜像
ffmpeg -i image_source -vf vflip out_source
视频处理
1、视频压缩
将视频压缩到指定大小
ffmpeg -i Desktop/input.mp4 -fs 10MB Desktop/output.mp4
-fs 10 : 表示文件大小最大值为10MB
设置视频的帧率为20fps
ffmpeg -i Desktop/input.mp4 -r 20 Desktop/output.mp4
-r 20:表示帧率设置为 20fps
设置视频的码率
ffmpeg -i Desktop/input.mp4 -b:v 1M Desktop/output.mp4
-b:v :指定视频的码率
-b:a : 指定音频的码率
1M:码率的值 1M 表示 1Mb/s(清晰度会降低)
设置视频的分辨率
ffmpeg -i Desktop/input.mp4 -s 1920x1080 Desktop/output.mp4
-s 1920x1080表示分辨率为1920x1080
-s vga : 指定分辨率, vga 代表 600*480,也可以换成其他的值
可以结合上面的命令一起来使用
ffmpeg -i Desktop/input.mp4 -s 1920x1080 -b:v 1M -r 20 Desktop/output.mp4