ffmpeg的常用命令
记录一下经常用到的ffmpeg使用方法、hevc官方软件HM的使用,以及shell脚本的配套使用
另外,对于ffmpeg的参数设置可以参考https://blog.csdn.net/hemingwang0902/article/details/4382205
https://www.jianshu.com/p/a035056cbbf9
具体比较详细的应用可以参考https://www.jianshu.com/p/b4f9f8c5e86a
https://zhuanlan.zhihu.com/p/46903150
(一) ffmpeg的常用操作
1.使用ffmpeg把jpg格式的图片转换成yuv420p格式
ffmpeg -i path/name.jpg -s 352x288 -pix_fmt yuv420p savepath/name.yuv
-s 352x288是图片的width和height参数,可以省略
-pix_fmt yuv420p是指定要转换的yuv的格式,若想转换成yuv422p格式的话直接替换就行
2.使用ffmpeg把yuv格式的图片转换成jpg格式
ffmpeg -s 352x288 -pix_fmt yuv420p -i path/name.yuv -pix_fmt rgb24 savepath/name.jpg
这里的格式是转换成rgb24位。若想要存成png格式,改变要保存的图片的后缀即可
3.使用ffmpeg把MP4格式的视频转换成yuv格式
ffmpeg -i path/name.avi -c:v rawvideo -pix_fmt yuv420p path/name.yuv -video_size 320x480
这里-c:v和-vcodec是等价的
4.把yuv格式的视频转换成avi格式
ffmpeg -s 320x480 -i path/name.yuv -vcodec copy path/name.avi
-s设置视频的长宽参数,copy表示copy表示原始编解码数据必须被拷贝,转换前后视频的大小不变,也可以换成mpeg4等编码格式
5.ffmpeg将一个视频切成多张图片
ffmpeg -i path/name.avi savepath/Frame%3d.png
6.ffmpeg将多张图片合成一个视频
ffmpeg -r 30 -i path/Frame%3d.png -vcodec libx264 name.avi
-r设置帧率,-vcodec可以选择要合成的视频的编码格式,如果是copy的话合成的视频就会比较大,其他很多都是带压缩的比如libx264,mpeg4等,有些在linux下可以打开,而在win下却不能直接用系统自带视频播放器查看,但是可以自己下载适合的视频播放器。
这里的图片名字需要不间断的%3d的格式,因为合成的时候需要一个顺序
7.使用ffplay播放yuv格式的视频或图片
ffplay -i name.yuv -video_size 352x288
-video_size设置窗口格式,不能省略,也可以使用-s
如果是只想查看yuv视频的Y通道
ffplay -s 352x288 -vf extractplanes='y' 1.yuv
(二)使用TAppEncoder来得到h.265压缩编码格式
HEVC/H.265相较于H.264来说,编码更加自由,压缩效率会更好,并且能在有限的带宽下传输更高质量的网络视频,只需原先H.264编码的一半带宽即可传输相同质量的视频,并且编码效率也是H.264的两倍,压缩率更高。
对于HEVC的官方软件HM的使用方法以及使用工具TAppEncoder等的安装可参考https://blog.csdn.net/leixiaohua1020/article/details/49912113
https://blog.csdn.net/liangjiubujiu/article/details/80573548
这些教程主要是介绍windows下的使用方法,如果想在linux(如ubuntu)环境下使用的话,可以参考https://www.cnblogs.com/gjianw217/p/3505295.html
使用HEVC编码格式对视频进行压缩时,需要把视频先转换成yuv格式
如果原视频是mp4、avi等格式可以参考上面的ffmpeg转换方法,如果是y4m格式的视频可以用下面的方法
mencoder **.y4m -ovc raw -of rawvideo -vf format=i420 -o **.yuv
而且需要对配置文件cfg根据实际需要进行个性化编写(有很多参考的cfg文件)
./TAppEncoderStatic -c encoder_intra_main37.cfg -i path/name.yuv -wdt 352 -hgt 288 -b binpath/name-37.bin -o savepath/name-37.yuv
-b保存压缩的比特流,-o为解压后的有损视频
这里的关键是-c参数,指定cfg配置文件,intra_main表示全i帧,lowdelay表示i帧和b帧,lowdelay_P表示i帧和p帧,具体区别可看https://blog.csdn.net/snowsnowsnow1991/article/details/48491099
https://blog.csdn.net/liangjiubujiu/article/details/80576873
https://blog.csdn.net/tianzhaixing2013/article/details/8773635
(三)
如果是在linux里面想同时处理多个任务的时候可以使用脚本语言来操作
这里用一些例子记录一些平时用的比较多的语法
# 对于for循环的使用
for num in {1..8}
do
cp 321x481/15004.jpg ceshi/$num.jpg
echo $num
done
ffmpeg -i ceshi/%d.jpg ceshi/15004.avi
rm ceshi/*.jpg
# 读取文件夹下的文件列表、对if语句的使用、提取文件名、批量压缩视频
path=./yuvs/tntsvc/
files=$(ls $path)
for filename in $files
do
name=${filename%%.*}
namea=${name%%_*}
nameb=${name##*_}
if [ $nameb == "cif" ]; then
./TAppEncoderStatic -c encoder_intra_main37.cfg -i yuvs/tntsvc/$name.yuv -wdt 352 -hgt 288 -b dataset/37/bins/$name-37.bin -o dataset/37/yuvs/$name-37.yuv
./TAppEncoderStatic -c encoder_intra_main42.cfg -i yuvs/tntsvc/$name.yuv -wdt 352 -hgt 288 -b dataset/42/bins/$name-42.bin -o dataset/42/yuvs/$name-42.yuv
elif [ $nameb == "4cif" ]; then
./TAppEncoderStatic -c encoder_intra_main37.cfg -i yuvs/tntsvc/$name.yuv -wdt 704 -hgt 576 -b dataset/37/bins/$name-37.bin -o dataset/37/yuvs/$name-37.yuv
./TAppEncoderStatic -c encoder_intra_main42.cfg -i yuvs/tntsvc/$name.yuv -wdt 704 -hgt 576 -b dataset/42/bins/$name-42.bin -o dataset/42/yuvs/$name-42.yuv
fi
done
# 变量num实现自加、整数转换成string以及ffmpeg的批量操作
path=tennis
files=$(ls $path)
num=-1
for filename in $files
do
num=`expr $num + 1`;
var=$(printf "%03d" "$num")
name=${filename%%.*}
geshi=${filename%%*.}
nameb=${filename##*.}
echo $filename, $name , $geshi , $nameb
if [ $nameb == "png" ]; then
rm $path/$filename
fi
ffmpeg -s 352x240 -i $path/$filename -vcodec copy imgs/Frame$var.png
done