自己动手写RTP服务器――传输所有格式的视频
睿丰德科技 专注RFID识别技术和条码识别技术与管理软件的集成项目。质量追溯系统、MES系统、金蝶与条码系统对接、用友与条码系统对接
上一篇文章我们介绍了如何用一个简单的UDP socket搭建一个RTP服务器。我把这份80行的代码呈现到客户面前的时候,就有人不满意了。
还有人在参考的时候会问:“楼主你的TS格式的文件是哪里来的?应该去哪里下载?”
“这也太简单了吧,不就是用UDP把TS文件发过去么?就这么几十行代码也算个大作业?”
“平时看的视频格式哪有TS的呀,不是avi就是mp4、rmvb什么的,根本不实用啊!” 首先回答问题1: 如果你用过强大的ffmpeg,就可以用一行简单的命令 [plain] view plaincopy
“这也太简单了吧,不就是用UDP把TS文件发过去么?就这么几十行代码也算个大作业?”
“平时看的视频格式哪有TS的呀,不是avi就是mp4、rmvb什么的,根本不实用啊!” 首先回答问题1: 如果你用过强大的ffmpeg,就可以用一行简单的命令 [plain] view plaincopy
- ffmpeg -i INPUTFILE.XXX OUTPUTFILE.ts
预备知识
我们是否可以调用别人的分流器或者解码器? 不要告诉我不可以。如果真的不可以,那么我们岂不是要把各种格式的视频解码器实现一遍?也就是说我们要自己重新写一个ffmpeg工程! 当然是可以的,关键是看如何使用。有几种选择:借用别人的源码然后集成到我们的工程;或是调用别人的接口来使用已经编译好的库;还是直接使用别人的程序?这就是复用粒度大小的选择。很少有人会用第一种方法,因为别人的源码不见得拿来就能编译通过并且成功使用。多数人会选择第二种方法,看起来顺理成章,也是可以适应一定需求变化的。(这是做软件最需要考虑的地方) 不过鉴于这个项目是一个课堂的作业,加上我比较喜欢偷懒,就选择了最简单的第三种方法。参考代码
第一步
首先需要对上一篇中的代码做一些简单的修改: 把原先的 [cpp] view plaincopy- int main(){
- 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。 [plain] view plaincopy- #!/bin/sh
- mkfifo fifo.ts
- ffmpeg -i $1 -y fifo.ts &
- ./rtp_server fifo.ts