上一篇文章咱们介绍了如何用一个简单的UDP socket搭建一个RTP服务器。我把这份80行的代码呈现到客户面前的时候,就有人不满意了。
还有人在参考的时候会问:“楼主你的TS格式的文件是哪里来的?应该去哪里下载?”
“这也太简单了吧,不就是用UDP把TS文件发过去么?就这么几十行代码也算个大做业?”
“平时看的视频格式哪有TS的呀,不是avi就是mp四、rmvb什么的,根本不实用啊!”
首先回答问题1:
若是你用过强大的ffmpeg,就能够用一行简单的命令
- ffmpeg -i INPUTFILE.XXX OUTPUTFILE.ts
把几乎任何格式的文件转换成TS文件。
再回答问题2:
若是能实现一样的功能,我确实更倾向使用简单的方法。说我偷懒也好,没有技术含量也好。我以为,不少时候最简单直接的方法最有效。
这篇帖子主要的内容就是来回答问题3:如何用RTP协议传输各类格式的视频。
预备知识
咱们是否能够调用别人的分流器或者解码器?
不要告诉我不能够。若是真的不能够,那么咱们岂不是要把各类格式的视频解码器实现一遍?也就是说咱们要本身从新写一个ffmpeg工程!
固然是能够的,关键是看如何使用。有几种选择:借用别人的源码而后集成到咱们的工程;或是调用别人的接口来使用已经编译好的库;仍是直接使用别人的程序?这就是复用粒度大小的选择。不多有人会用第一种方法,由于别人的源码不见得拿来就能编译经过而且成功使用。多数人会选择第二种方法,看起来瓜熟蒂落,也是能够适应必定需求变化的。(这是作软件最须要考虑的地方)
不过鉴于这个项目是一个课堂的做业,加上我比较喜欢偷懒,就选择了最简单的第三种方法。
第一步
首先须要对上一篇中的代码作一些简单的修改:
把原先的
- int main(int argc, char **argv){
再把原先的
- FILE *ts_file = fopen("/home/baby/Videos/480p.ts", "r+");
改成
- if (argc != 2){
- puts("Usage: ./rtp_server INPUTFILE");
- return 0;
- }
- FILE *ts_file = fopen(argv[1], "r+");
能够看出咱们此次不读取固定文件,而是根据用户本身的输入读取文件,这样就灵活了许多。
第二步
源代码编译经过后,只需写一个简单的shell脚本mk_rtp_server.sh。
- #!/bin/sh
- mkfifo fifo.ts
- ffmpeg -i $1 -y fifo.ts &
- ./rtp_server fifo.ts
只有四行有木有,很简单有木有!
其实就是利用了ffmpeg的分流与解码,而后利用命名管道把ffmpeg的输出处处到一个管道中,而后再用咱们前面写好的rtp_server去读这个文件。
(切记ffmpeg参数里面的-y是必不可少的)
OK,大功告成。chmod以后执行这个脚本文件./mk_rtp_server.sh INPUTFILE.XXX,拿个播放器测试一下。”嗯~果真不错~“
只要你的ffmpeg装的够完整,那么几乎全部的格式均可以变成rtp流。包括avi之类的非实时流文件格式。
大功告成!而且远远超过了当初的需求,可是客户的需求善变如人心,下一步又是什么呢?