自己动手写RTP服务器——传输所有格式的视频

简介: 上一篇文章我们介绍了如何用一个简单的UDP socket搭建一个RTP服务器。我把这份80行的代码呈现到客户面前的时候,就有人不满意了。 还有人在参考的时候会问:“楼主你的TS格式的文件是哪里来的?应该去哪里下载?”“这也太简单了吧,不就是用UDP把TS文件发过去么?就这么几十行代码也算个大作业?...
+关注继续查看
上一篇文章我们介绍了如何用一个简单的UDP socket搭建一个RTP服务器。我把这份80行的代码呈现到客户面前的时候,就有人不满意了。
还有人在参考的时候会问:“楼主你的TS格式的文件是哪里来的?应该去哪里下载?”
“这也太简单了吧,不就是用UDP把TS文件发过去么?就这么几十行代码也算个大作业?”
“平时看的视频格式哪有TS的呀,不是avi就是mp4、rmvb什么的,根本不实用啊!”
 
首先回答问题1:
如果你用过强大的ffmpeg,就可以用一行简单的命令
[plain] view plaincopy
 
 
  1. ffmpeg -i INPUTFILE.XXX OUTPUTFILE.ts  
把几乎任何格式的文件转换成TS文件。
 
再回答问题2:
如果能实现同样的功能,我确实更倾向使用简单的方法。说我偷懒也好,没有技术含量也好。我觉得,很多时候最简单直接的方法最有效。
 
这篇帖子主要的内容就是来回答问题3:如何用RTP协议传输各种格式的视频。

预备知识

我们是否可以调用别人的分流器或者解码器?
不要告诉我不可以。如果真的不可以,那么我们岂不是要把各种格式的视频解码器实现一遍?也就是说我们要自己重新写一个ffmpeg工程!
当然是可以的,关键是看如何使用。有几种选择:借用别人的源码然后集成到我们的工程;或是调用别人的接口来使用已经编译好的库;还是直接使用别人的程序?这就是复用粒度大小的选择。很少有人会用第一种方法,因为别人的源码不见得拿来就能编译通过并且成功使用。多数人会选择第二种方法,看起来顺理成章,也是可以适应一定需求变化的。(这是做软件最需要考虑的地方)
不过鉴于这个项目是一个课堂的作业,加上我比较喜欢偷懒,就选择了最简单的第三种方法。

参考代码

第一步

首先需要对上一篇中的代码做一些简单的修改:
把原先的
[cpp] view plaincopy
 
 
  1. int main(){  
改为
[cpp] view plaincopy
 
 
  1. int main(int argc, char **argv){  
再把原先的
[cpp] view plaincopy
 
 
  1. FILE *ts_file = fopen("/home/baby/Videos/480p.ts", "r+");  
改为
[cpp] view plaincopy
 
 
  1. if (argc != 2){  
  2.     puts("Usage: ./rtp_server INPUTFILE");  
  3.     return 0;  
  4. }  
  5. FILE *ts_file = fopen(argv[1], "r+");  
可以看出我们这次不读取固定文件,而是根据用户自己的输入读取文件,这样就灵活了许多。

第二步

源代码编译通过后,只需写一个简单的shell脚本mk_rtp_server.sh。
[plain] view plaincopy
 
 
  1. #!/bin/sh  
  2. mkfifo fifo.ts  
  3. ffmpeg -i $1 -y fifo.ts &  
  4. ./rtp_server fifo.ts  
只有四行有木有,很简单有木有!
其实就是利用了ffmpeg的分流与解码,然后利用命名管道把ffmpeg的输出到处到一个管道中,然后再用我们前面写好的rtp_server去读这个文件。
(切记ffmpeg参数里面的-y是必不可少的)
OK,大功告成。chmod之后执行这个脚本文件./mk_rtp_server.sh INPUTFILE.XXX,拿个播放器测试一下。”嗯~果然不错~“
只要你的ffmpeg装的够完整,那么几乎所有的格式都可以变成rtp流。包括avi之类的非实时流文件格式。
 
大功告成!并且远远超过了当初的需求,但是客户的需求善变如人心,下一步又是什么呢?
目录
相关文章
|
25天前
|
Java Linux
java实现两台linux服务器间下载上传传输文件
java实现两台linux服务器间下载上传传输文件
|
4月前
|
消息中间件 NoSQL Linux
Linux系列——不同服务器之间的远程传输文件命令
Linux系列——不同服务器之间的远程传输文件命令
|
4月前
|
算法 安全 Ubuntu
Linux教程丨使用rsync在服务器中高效传输文件,断点续传快速上传下载数据
Linux教程丨使用rsync在服务器中高效传输文件,断点续传快速上传下载数据
|
5月前
POST请求body实现数据以记事本格式保存在服务器
POST请求body实现数据以记事本格式保存在服务器
28 0
|
5月前
|
Web App开发 移动开发 数据可视化
Echarts本地导入Excle表格作为数据服务器的解决方案(支持.xls和.xlsx格式)
Echarts本地导入Excle表格作为数据服务器的解决方案(支持.xls和.xlsx格式)
70 0
|
11月前
|
Linux 数据安全/隐私保护
通过jumpserver传输文件到linux服务器
通过jumpserver传输文件到linux服务器
1590 0
通过jumpserver传输文件到linux服务器
|
12月前
|
Ubuntu Linux Windows
Ubuntu与Ubuntu服务器传输
Ubuntu与Ubuntu服务器传输
76 0
angular2-服务器和客户端传输
angular2-服务器和客户端传输
41 0
angular2-服务器和客户端传输
|
数据安全/隐私保护
两台服务器间传输文件【scp命令】
两台服务器间传输文件【scp命令】
两台服务器间传输文件【scp命令】
|
网络协议 数据安全/隐私保护
【计算机网络】应用层 : FTP 文件传输协议 ( FTP 客户端 和 服务器 | FTP 工作原理 | FTP 传输模式 )
【计算机网络】应用层 : FTP 文件传输协议 ( FTP 客户端 和 服务器 | FTP 工作原理 | FTP 传输模式 )
314 0
相关产品
云迁移中心
推荐文章
更多