自己動手寫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