libav(ffmpeg)简明教程(2)
距离上一次教程又过去了将近一个多月,相信大家已经都将我上节课所说的东西所完全消化掉了。
这节课就来点轻松的,说说libav的命令使用吧。
注:遇到不懂的或者本文没有提到的可以用例如命令后加 --help full或者man 命令(man avconv)查看全部参数细节,或者进libav.org网站查:https://libav.org/avconv.html
杀手级命令:avconv:
个人认为他最强大的功能就是对各种格式的支持范围非常广,你拥有了它可以完全丢弃例如在Windows上格式工厂之类的软件,它支持你所有市面上流行的媒体格式文件。
最简单的转换格式的命令示例(将src.avi文件按照原视频比例转换成MP4格式放置到dst.mp4): avconv -i src.avi dst.mp4
如果你是想将视频中的每一帧输出成图片序列保存到磁盘上,请输入:avconv -i src.avi dst_%d.jpg
反过来如果你有按照一定规律命名好的图片序列(类似像src_0.jpg,src_1.jpg,src_2.jpg...),也可以反过来输入导出成最终视频:avconv -i src_%d.jpg dst_mp4
除了文件中的视频、图片序列可以用来作参数以外,还可以将rtsp网络视频作为参数:avconv -i rtsp://hostname[:port]/path dst.mp4
如果你想要将视频缩小一下尺寸示例(将视频转换成dst.mp4并且重置分辨率为:320x240),长宽像素数字必须同时为偶数并且大于100,,还可以填入720p、1080p之类的字符:avconv -i src.avi -s 320x240 dst.mp4
如果你想只要将原视频的前6秒转换出来的话,请输入:avconv -ss 00:00:00 -t 00:00:06 -i src.avi dst.mp4
想将原视频bite rate修改,请使用-r参数:avconv -i src.avi -r 2397600 dst.mp4
同理原视频中的音频同样也有sample rate修改的需求,请使用avconv -i src.avi -f -sample_rates 128000 dst.mp4
如果想将pixel formats重新定义的话,请使用-pix_fmt参数(注:必须是这个文件格式所支持的pix_fmts):avconv -i src.avi -pix_fmts AV_PIX_FMT_YUV420P dst.mp4
同理音频也需要sample_fmts重新设置的话,使用-sample_fmts参数,同样是输出文件格式所支持的format才能成功:avconv -i src.avi -sample_fmts AV_SAMPLE_FMT_FLTP dst.mp4
细心的人会发现上面的命令中修改sample rate中多包含了-f,其实-f是filter的意思,它是libav另外一个非常强大的工具,当你每次打开libav的源文件或者官网介绍中会发现有很多的和filter相关新奇的部分。
下面以一个简单的例子介绍一下它:
avconv -i src.avi -f clock dst.mp4 顺时针旋转视频90度就这么简单! more detail
libav还实现了并支持SAP(Session Announcement Protocol),
你一句命令就可以:avconv -re i src.avi sap sap://0.0.0.0, 播放就用avplay命令直接带 sap://localhost即可播放,或者用VLC player直接打开网络地址播放,强大吧?
libav还引用了另外一个强大的库——frei0r,它本身是用C写的一个视频特效处理的库,使用它只需给定一些简单少许的参数即可实现强大的效果,虽然我还没真正测试过,有兴趣的朋友可以玩玩看回复在下面。
另外它作为一个成熟的视频库,怎么能缺少对rtsp协议的支持呢?
建立rtsp服务器,使用命令avserver -f avserver.conf
其中avserver.conf 是一个文本文件,需要实现写好内容像这样:
Port 8848 RTSPPort 8840 BindAddress 0.0.0.0 MaxClients 100 MaxBandwidth 1000000 CustomLog connlogs.txt <Stream test.html> File "fsbk.flv" Format flv </Stream> <Stream status.html> Format status </Stream>
是不是相当简单,如果你发现端口被占用了,输入sudo fuser -k 8848/tcp 和 sudo fuser -k 8840/tcp 杀掉相应的进程。然后执行avplay http://localhost:8848/test.html 视频就通过网络传过来了对吧,就这么简单是吧~