FFmpeg视频处理
FFmpeg视频处理,包括视频抽帧、视频转码、视频裁剪和格式转换等操作
目录
1. Ubuntu(wsl)安装 ffmpeg
更新源:sudo apt update
添加源:sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next
安装ffmpeg:sudo apt-get install ffmpeg
查看版本:ffmpeg -version
2. ffmpeg查看指令
查看ffmpeg支持的编码器:ffmpeg configure -encoders
查看ffmpeg支持的解码器:ffmpeg configure -decoders
查看ffmpeg支持的通信协议:ffmpeg configure -protocols
查看ffmpeg所支持的音视频编码格式、文件封装格式与流媒体传输协议等:ffmpeg configure --help
查看ffmpeg的支持格式的列表:ffmpeg -formats
获取ffmpeg使用帮助:man ffmpeg
3. ffmpeg查看媒体文件信息
ffmpeg -i video_file.mp4 # 查看视频文件信息
ffmpeg -i audio_file.mp3 # 查看音频文件信息
# 使用 -hide_banner 隐藏掉与文件无关的信息(ffmpeg本身的信息)
ffmpeg -i video_file.mp4 -hide_banner
ffmpeg -i audio_file.mp3 -hide_banner
4. ffmpeg基础操作指令
- 查看视频总帧数
ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 test.mp4
- 视频中抽取音频,直接加一个 -vn 参数就可以
ffmpeg -i video.mp4 -vn audio.mp3
- 使用 -an 来获得纯视频 , -an 标记会让所有的音频参数无效
ffmpeg -i video_input.mp4 -an -video_output.mp4
- jpg转换成png,其它格式转换同理
ffmpeg -i ./images/img%5d.jpg ./images_new/img%5d.png
-
设置视频的屏幕高宽比,使用 -aspect 标志设置一个视频文件的屏幕高宽比。通常使用高宽比:16:9,4:3,16:10,5:4,2:21:1,2:35:1,2:39:1
ffmpeg -i input.mp4 -aspect 16:9 output.mp4
5. ffmpeg视频抽帧
5.1 基于时间抽取帧
- 参数说明:-ss 设定起始抽帧时间,语法:hh:mm:ss;-t 表示抽帧持续时间,单位为秒;-vframes 指定抽取的帧数
ffmpeg -i test.mp4 -r 1 -ss 00:00:05 -f image2 img_%05d.jpeg
ffmpeg -i test.mp4 -r 1 -ss 00:00:05 -vframes 5 -f image2 img_%05d.jpeg
ffmpeg -i test.mp4 -r 1 -t 4 -f image2 img_%05d.jpeg
- input seeking。input seeking使用的是key frames,所以速度很快;参数说明:-frame:v 5,在video stream上截取5帧。
ffmpeg -ss 00:00:05 -i test.mp4 -frames:v 5 img_%05d.jpg
- output seeking。output seeking是逐帧decode,直到1分05秒,所以速度很慢
ffmpeg -i test.mp4 -ss 00:00:05 -frames:v 5 img_%05d.jpg
5.2 两种抽帧方式
- 方法一,该抽帧方式画质较好。参数说明:-i 输入文件,源文件;-f 指定保存图片使用的格式;image2 图像解析模式; img%05d.jpg 格式化输出图片;-vf:设置过滤器;fps=fps=1/5 表示5s抽一帧,fps=fps=5 表示1s抽5帧
ffmpeg -i /data/test.mp4 -f image2 -vf fps=fps=1/5 -qscale:v 2 /data/img%05d.jpg
- 方法二,该抽帧方式画质稍差。 参数说明:-r 指定抽取的帧率,即从视频中每秒钟抽取图片的数量;1代表每秒抽取一帧,5表示一秒抽5张,1/5表示5秒抽一张。
ffmpeg -i test.mp4 -r 1 -f image2 img%05d.jpeg
5.3 视频流抽帧
-
rtsp流抽帧。参数说明:-y :如果提示文件已经存在,自动执行y,对已存在文件进行覆盖;-f image2:以图片格式保存;-r 1:帧数,每秒截取一帧,-r 1/5 表示每5秒抽取一帧;img%03d.jpg 格式化命名,会生成img001.jpg,img002.jpg
ffmpeg -i "rtsp://dxcs:cs123456@200.36.43.131:554/Streaming/Channels/1001" -y -f image2 -r 1/1 img%03d.jpg
-
rtsp流抽帧,tcp协议推流需要加上: -rtsp_transport tcp
ffmpeg -rtsp_transport tcp -i "rtsp://dxcs:cs123456@200.36.43.131:554/Streaming/Channels/1001" -y -f image2 -r 1/5 img%03d.jpg
-
直接保存RTMP视频流到本地
ffmpeg -i rtmp://live.hkstv.hk.lxdns.com/live/hks -c copy ./test1.flv
-
直接保存RTSP视频流到本地。参数说明:-vcodec copy 表示不重新编码,在格式未改
ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -vcodec copy -acodec copy ./rtsp1.flv
5.4 视频批量抽帧
- 视频文件目录
- videos
- 1.mp4
- 2.mp4
- ………
- videos_imgs
- 为空(脚本会以视频文件名自动创建文件夹,并保存抽帧图像)
- bash frame.bash
- videos
- 批量抽帧shell脚本 frame.bash
#!/usr/bin/env bash
videos_root=./videos
save_root=./videos_imgs/
for video in $videos_root/*;
do
echo $video
save_dir=$save_root$(basename $video)
if [ ! -d $save_dir ];then
mkdir $save_dir
fi
ffmpeg -i $video -f image2 -vf fps=fps=1/5 -qscale:v 2 $save_dir/img%05d.jpg
done
6. ffmpeg更改视频播放速度
-
双倍视频播放速度
ffmpeg -i test.mp4 -vf "setpts=0.5*PTS" result.mp4
-
四倍视频播放速度
ffmpeg -i test.mp4 -an -r 50 -filter:v "setpts=0.25*PTS" result.mp4
-
降低视频播放速度,使用一个大于 1 的倍数
ffmpeg -i test.mp4 -vf "setpts=4.0*PTS" output.mp4
7. ffmpeg视频格式转换
-
转换mp4文件到avi文件
ffmpeg -i test.mp4 output.avi
-
转换flv格式视频为mpeg格式
ffmpeg -i video.flv video.mpeg
-
同时指定多个输出后缀,输出多个文件
ffmpeg -i audio_input.wav audio_output_1.mp3 audio_output_2.ogg
-
维持源视频文件的质量,使用-qscale 0 参数
ffmpeg -i test.mp4 -qscale 0 output.flv
-
转换所给定视频input.mp4文件的开始 10 秒到视频 .avi 格式
ffmpeg -i input.mp4 -t 10 output.avi
8. ffmpeg视频裁剪
- 基于时间进行视频裁剪。参数说明:开始时间 (-ss HH:MM:SS), 持续秒数 (-t duration), 结束时间 (-to HH:MM:SS), 和开始秒数 (-s duration)
ffmpeg -i input_audio.mp3 -ss 00:01:14 output_audio.mp3
ffmpeg -i input_audio.wav -ss 00:00:30 -t 10 output_audio.wav
ffmpeg -i input_video.h264 -ss 00:01:30 -to 00:01:40 output_video.h264
ffmpeg -i input_audio.ogg -ss 5 output_audio.ogg
ffmpeg -i input.mp4 -ss 00:00:50 -codec copy -t 50 output.mp4
- 裁剪视频文件为多个部分。参数说明:-t 00:00:30 表示从视频的开始到视频的第 30 秒创建一部分视频;-ss 00:00:30 为视频的下一部分显示开始时间戳。表示第 2 部分将从第 30 秒开始,并将持续到原始视频文件的结尾
ffmpeg -i input.mp4 -t 00:00:30 -c copy part1.mp4 -ss 00:00:30 -codec copy part2.mp4
- 基于宽高进行裁剪。参数说明:input.mp4 – 源视频文件;-filter:v – 表示视频过滤器;crop – 表示裁剪过滤器(w – 源视频中裁剪的矩形的宽度,h – 矩形的高度;x – 源视频中裁剪的矩形的 x 坐标 ;y – 矩形的 y 坐标
ffmpeg -i input.mp4 -filter:v "crop=w:h:x:y" output.mp4
# 想要一个来自视频的位置 (200,150),且具有 640 像素宽度和 480 像素高度的视频;剪切视频将影响质量
ffmpeg -i input.mp4 -filter:v "crop=640:480:200:150" output.mp4
9. ffmpeg图片转视频
-
规则图片名称转视频。参数说明:-r 25 表示每秒播放25帧;-b 200k 指定码率为200k;将`img00001.jpg’, `img00002.jpg'这种顺序排列的图片文件转制作为视频
ffmpeg -f image2 -i ./images/img%05d.jpg ./result.mp4
ffmpeg -f image2 -i './images/img%05d.jpg' -vcodec libx264 -r 25 -b 200k result.mp4
-
不规则图片名称转视频。参数说明:-framerate 10:视频帧率;-pattern_type glob:Glob pattern 模糊匹配;-f image2pipe:图像管道,模糊匹配得到图片名称
ffmpeg -framerate 10 -pattern_type glob -i './images/*.jpg' out.mp4
cat ./images/*.jpg | ffmpeg -f image2pipe -i - output.mp4
10. ffmpeg更改视频分辨率
-
设置一个视频文件为指定的分辨率
# 使用 -c:a 来保证音频编码是正确的
ffmpeg -i input.mp4 -filter:v scale=1280:720 -c:a copy output.mp4
# 参数说明:-s 表示设置目标视频文件的分辨率,将设置所给定视频文件的分辨率到 1280×720
ffmpeg -i test.mp4 -s 1280:720 -c:a copy output.mp4
11. ffmpeg视频旋转
-
将视频顺时针旋转90°
ffmpeg -i test.mp4 -c copy -metadata:s:v:0 rotate=90 result.mp4
ffmpeg -i input.avi -vf "rotate=90*PI/180"
-
上下颠倒视频(翻转了180°)
ffmpeg -i input.mp4 -vf "rotate=PI"
12. ffmpeg视频转码及压缩
-
MPEG4编码转成H264编码
ffmpeg -i data.mp4 -strict -2 -vcodec h264 output.mp4
-
H264编码转成MPEG4编码
ffmpeg -i data.mp4 -strict -2 -vcodec mpeg4 output.mp4
-
视频裁剪转码及压缩。-crf 参数 (恒定质量因子). 较小的crf 意味着较大的码率,同时使用 libx264 编码器也有助于减小文件体积
ffmpeg -i data.mp4 -ss 00:03 -to 10:08 -c:v libx264 -crf 30 result.mp4
ffmpeg -i video_input.mp4 -c:v libx264 -crf 28 video_output.mp4
# 压缩视频文件,减小视频文件的大小,将损失视频质量。如果 24 太有侵略性,可以降低 -crf 值到或更低值
ffmpeg -i test.mp4 -vf scale=1280:-1 -c:v libx264 -preset veryslow -crf 24 output.mp4
13. ffmpeg合并多个视频
# 创建包含想接合文件的准确的路径的 join.txt。所有的文件都应该是相同的格式(相同的编码格式)。
# 所有文件的路径应该逐个列出,例如:
file /home/myvideos/part1.mp4
file /home/myvideos/part2.mp4
file /home/myvideos/part3.mp4
file /home/myvideos/part4.mp4
ffmpeg -f concat -i join.txt -c copy output.mp4
#若出现错误join.txt: Operation not permitted,添加-safe 0
ffmpeg -f concat -safe 0 -i join.txt -c copy output.mp4
更多推荐
所有评论(0)