- -i 设定输入流
- -f 设定输出格式(format)
- -ss 开始时间
- -t 时间长度
#修改音视频容器格式为flv,拷贝编码格式,复制0-20s数据
ffmpeg -i test.mp4 -ss 0 -t 20 -codec copy -f flv out.flv
#-f参数可以省略,自动识别输出格式
ffmpeg -i test.mp4 -ss 0 -t 20 -codec copy out.flv
- -vframes 设置要输出的视频帧数
- -b 设定视频码率
- -b:v 视频码率
- -r 设定帧速率
- -s 设定画面的宽与高
- -vn 不处理视频
- -aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777
- -vcodec 设定视频编解码器,如果用copy表示原始编解码数据必须被拷贝。
- -vf 视频过滤器
#查看h265编码格式
ffmpeg -encoders | grep h265
--enable-libx265
#修改视频码率为64k,帧率30帧,分辨率:640x480,纵横比4:3,编码格式为h265
ffmpeg -i test.mp4 -vframes 5 -b 64k -r 30 -s 640x480 -aspect 4:3 -vcodec libx265 test-video-265.mp4
#提取视频数据
ffmpeg -i test.mp4 -vcodec copy -an test-no-audio.mp4
修改后:
注意:修改后可以看到视频的码率并没有生效,所以参数之间是相互影响的。
- -aframes 设置要输出的音频帧数
- -b:a 音频码率
- -ar 设定采样率
- -ac 设定声音的Channel数
- -acodec 设定声音编解码器,如果用copy表示原始编解码数据必须被拷贝。
- -an 不处理音频
- -af 音频过滤器
#查看mp3编码格式
ffmpeg -encoders | grep mp3
A..... libmp3lame libmp3lame MP3 (MPEG audio layer 3) (codec mp3)
#修改音频音频码率为64k,采样率为16000,双通道,编码格式为mp3,输出100帧大小
ffmpeg -i test.mp4 -aframes 100 -b:a 64k -ar 16000 -ac 2 -acodec libmp3lame test-audio.mp4
#提取音频数据
ffmpeg -i test.mp4 -acodec copy -vn test-no-video.mp4
首先用mediainfo查看音视频格式,然后直接提取到对应文件
#提取文件中aac音频数据
ffmpeg -i test.mp4 -acodec copy -vn test-no-video.aac
#提取文件中h264视频码流
ffmpeg -i test.mp4 -vcodec copy -an test-no-audio.h264
有时候需要将音视频格式转换为需要的格式,可以指定具体的编码格式进行编码,提取相关的数据。
#将视频编码格式转换为h265
ffmpeg -i test.mp4 -vcodec libx265 -an -vframes 5 test.h265
#将音频转换为mp3
ffmpeg -i test.mp4 -acodec libmp3lame -vn test.mp3
可以提取视频文件中的视频像素格式,比较常见的两种是yuv和rgb。这里需要注意像素格式是没有视频分辨率信息的需要在转换完成后将视频的分辨率附在名字上保证视频可以正常的播放。
#查看yuv格式
ffmpeg -pix_fmts | grep yuv
#提取视频像素格式为yuv420p,提取5s
ffmpeg -i test.mp4 -t 5 -pix_fmt yuv420p -s 320x240 test-yuv420p-320x240.yuv
#提取视频像素格式为rgb24
ffmpeg -i test.mp4 -t 5 -pix_fmt rgb24 -s 320x240 test-rgb24-320x240.rgb
#yuv420p转rgb24,需要指定输入的分辨率320x240
ffmpeg -s 320x240 -i test-yuv420p.yuv -pix_fmt rgb24 test-rgb24_320x240_1.rgb
播放视频像素格式需要指定基本的像素格式和分辨率
#播放yuv420p格式文件,需要指定像素格式为yuv420p,视频分辨率320x240
ffplay -pixel_format yuv420p -video_size 320x240 -i test-yuv420p-320x240.yuv
提取pcm数据指定采样率,通道数和封装格式即可
#查询采样格式
ffmpeg -formats | grep PCM
DE s32le PCM signed 32-bit little-endian
#提取pcm数据
ffmpeg -i test.mp3 -ar 16000 -ac 2 -f s16le 16000_2_s16le.pcm
#利用sample_fmt获取pcm数据
ffmpeg -sample_fmts | grep PCM
ffmpeg -i test.mp3 -ar 16000 -ac 2 -sample_fmt s16 16000_2_s16.wav
//利用encodec获取
ffmpeg -encoders | grep PCM
ffmpeg -i test.mp3 -ar 16000 -ac 2 -codec:a pcm_s16le 16000_2_s16le.wav
播放pcm数据需要指定采样率,通道数和封装格式。
ffplay -ar 16000 -ac 2 -f s16le 16000_2_s16le.pcm
保留封装格式的拷贝,这里需要注意的是保留封装格式-codec copy等价于-vcodec copy 加-acodec copy 加 -s copy即包含音频编码、视频编码和字幕。
#保留编码格式,转换封装格式为ts,
ffmpeg -i test.mp4 -codec copy -t 5 test.flv
指定编码格式主要修改两个参数,一个是vcodec,一个是acodec。需要注意的是如何查找自己想要的格式名称,一般采用-encoders
#将MP4中原格式h264转为h265;音频aac转成mp3
ffmpeg -i test.mp4 -vcodec libx265 -acodec libmp3lame -t 5 test-h265-mp3.ts
修改视频帧率、码率和分辨率
#修改视频码率为500k
ffmpeg -i test.mp4 -b:v 500k -t 5 test-bv500.ts
#修改视频帧率为10帧
ffmpeg -i test.mp4 -r:v 10 -t 5 test-rv10.ts
#修改视频分辨率为
ffmpeg -i test.mp4 -s:v 800x480 -t 5 test-sv10.ts
#修改音视频帧率
ffmpeg -i test.mp4 -r:v 10 -r:a 100 -t 5 test-rv10av10.ts
修改音频码率、采样率和采样精度
#修改音频码率为500k
ffmpeg -i test.mp4 -b:a 500k -vcodec copy -t 5 test-av500.ts
#修改音频采样率16000
ffmpeg -i test.mp4 -r:a 16000 -vcodec copy -t 5 test-ar10.ts
#修改音频采样精度位16bit
ffmpeg -i test.mp4 -q:a 16 -vcodec copy -t 5 test-aq16.ts
#修改音视频帧率
ffmpeg -i test.mp4 -r:v 10 -r:a 100 -vcodec copy -t 5 test-rv10av10.ts
视频裁剪需要根据起始位置和裁剪时长两部分组成,这里裁剪起始位置可以用秒数来表示也可以用格式化00:00:00来裁剪。另外在视频转换格式时需要注意转换为了视频兼容性增加bsf过滤器来保证视频转换后能正常播放。
#裁剪视频从第5秒开始裁剪10s长度视频
ffmpeg -i test.mp4 -ss 00:00:05 -t 10 -codec copy test-ss10.mp4
#裁剪视频从第5秒开始裁剪10s长度视频,加vbsf为了提高转换的兼容性
ffmpeg -bsfs | grep h264
h264_mp4toannexb
ffmpeg -i test.mp4 -ss 00:00:05 -t 10 -codec copy -vbsf h264_mp4toannexb test-ss10vbsf.ts
#视频拼接方式,concat命令进行拼接
ffmpeg -f concat -i mp4list.txt -codec copy test-concat2.mp4
vi mp4list.txt
file 'test.mp4'
file 'test-ss10.mp4'
视频转图片
图片转换时当转换多张图片时,需要利用格式化方式转换为多张图片。
#将视频转图片,%02d转换多张图片,转换一张图片可以用-vframes
ffmpeg -i test.mp4 -t 5 -s 640x360 -r 15 frame%03d.jpg
图片转视频
#将图片转为25帧率的mp4视频
ffmpeg -f image2 -i frame%02d.jpg -r 25 jpgtomp4.mp4