在之前的文章中,说的是使用VLC播放器来实现RTP流的发送及RTP流的接收并保存的操作。保存成本地的媒体封装格式,比如mp4格式或avi格式。但是做VOIP的话,大部分是使用G711的编码,而这些媒体容器的音频支持不是mp3格式,就是aac格式。VLC虽然支持的已经挺多了。后来测试,也支持mp4格式。并且也下载了源码,看了下,其流处理并保存的话,是在源码中的modules/mux,里面除了其官方wiki说的,支持ps/ts/ogg。其实还支持mp4,avi,asf,wav等这些常用的格式。虽然并非很多。但是找了一个使用avi封装的视频——视频编码为H.263,音频为aLaw。并用之前文章中的配置,不转码的情况下,使用RTP发送,并测试了保存成mp4,avi等一些的格式,播放对应的文件后,发现都只有视频,没有音频,也就是并没有把音频封装进去。这点就比较坑了。毕竟如果还需要进一步的转码的话。那样对于CPU是有额外的负担。
所以就各种谷歌了。想起有FFmpeg这个神器。其实VLC也是有链接FFmpeg的库的,只是实现了一些界面的东西,当然也不能这么说,其OO的编写方式还是很强的。可以说VLC是流处理中的GUI神器,那么FFmpeg就是命令处理的神器了。
与VLC一样的,FFmpeg也是可以直接使用ubuntu的源进行安装。但是我发现现在版本的14.04好像还没有被加入源中。所以我就只好自己去官网下了一份,编译了。如果源里面有的话,可以直接用命令安装上去:
sudo apt-get install libav-tools
如果需要进行调试之类的,可以从源码入手,现在官网最新版本是2.2.4版本。
wget https://www.ffmpeg.org/releases/ffmpeg-2.2.4.tar.bz2 tar -xf ffmpeg-2.2.4.tar.bz2
由于14.04还没把其加入到源里面,就随意编译了。也没安装到本地,而是直接运行了。还是和之前文章介绍的功能,用VLC发送RTP流,用FFmpeg接收流。其实FFmpeg也是支持发送RTP流的。
~/source/ffmpeg-2.2.4/ffmpeg -i /tmp/Stream.sdp -vcodec copy -acodec copy /tmp/1.avi
测试过了,用上面的命令,也就是输出是Stream.sdp文件,-vcodec参数是用于配置视频编码的,键值为copy时,就是说明只是做流的拷贝,并不做编解码操作。而-acodec则是音频的编码方式。也是用copy的方式。这样保证CPU只是来处理数据流及做视频容器的封装。尽量不做编解码操作。
经过一下午的测试,发现,可以很好的支持H.263/aLawj及H.264/aLaw,并且最好的封装格式,是avi或mkv格式。使用mp4的话,可能会出现错误,具体还没怎么深入的去了解。今天一整天开始都是折腾VLC,而不是FFmpeg。至于uLaw的话,还没有试过。应该aLaw可以的话,uLaw应该也不会有问题吧。先记录一下,ffmpeg有很多参数可以进行配置的。去年的时候,有看了一些代码,也没怎么记录,都忘记差不多了。
转载请注明: 转载自elkPi.com
本文链接地址: FFmpeg接收RTP流并保存
2017年5月4日
博主写得很好,支持下~