ffserver和ffmpeg配合完成的即時資料流媒體服務

來源:互聯網
上載者:User

ffmpeg和ffserver配合使用可以實現即時的流媒體服務,這裡即時的資料來自網路攝影機,如果考慮到應用程式和網路狀況,這裡用戶端看到的畫面還是會落後與網路攝影機本地擷取的畫面,最糟糕時甚至看不到畫面(扯遠了),這裡我們關注的是ffmpeg和ffserver之間是如何配合工作的,瞭解了他們之間的關係,對個別問題也能有的放矢。

ffserver先於ffmpeg啟動,它在啟動的時候需要加參數-f指定其設定檔,設定檔裡包含有向用戶端傳送的流的配置(如編碼方式,幀率,採樣率……),也有對feed1.ffm的配置,還有其他的一些配置。feed1.ffm是什嗎?這裡可以理解為一個緩衝檔案,下面會提到它是如何被用到,ffserver啟動後,feed1.ffm就會被建立,這時如果你開啟feed1.ffm看看,會發現feed1.ffm開始的部分已經寫入了內容,你可以找到關鍵字ffm以及向用戶端傳送流的配置資訊,在feed1.ffm做緩衝用的時候,這些資訊是不會被覆蓋掉的,就把它們理解為feed1.ffm檔案的頭吧。

ffserver啟動後,ffmpeg啟動,它啟動時加的一個關鍵參數就是“http://ip:8090/feed1.ffm”,其中ip是運行ffserver主機的ip,如果ffmpeg和ffserver都在同一系統中啟動並執行話,用localhost也行。ffmpeg啟動後會與ffserver建立一個串連(短暫的串連),通過這第一次的串連,ffmpeg從ffserver那裡擷取了向用戶端輸出資料流的配置,並把這些配置作為自己編碼輸出的配置,然後ffmpeg斷開了這次串連,再次與ffserver建立串連(長久的串連),利用這個串連ffmpeg會把編碼後的資料發送給ffserver。如果你觀察ffserver端的輸出就會發現這段時間會出現兩次HTTP的200,這就是兩次串連的過程。

ffmpeg從網路攝影機擷取資料後,按照輸出資料流的編碼方式編碼,然後發送給ffserver,ffserver收到ffmpeg的資料後,如果網路上沒有播放的請求,就把資料寫入feed1.ffm中緩衝,寫入時把資料加上些頭資訊然後分塊,每塊4096B(每塊也有結構),當feed1.ffm的大小到了ffserver.conf中規定的大小後,就會從檔案開始(跳過頭)寫入,覆蓋舊的資料。直到網路上有播放的請求,ffserver從feed1.ffm中讀取資料,發送給用戶端。

上面粗略的描述在即時資料流媒體服務時ffmpeg和ffserver的關係,這些看法都是在閱讀較早FFmpeg代碼(very old)時得出的,現在不知這個架構是否改變,兄弟我把磚扔出,希望大家用玉來砸。

 

 

 

 

 

 

 

回複

2009-03-01 19:36 非常感謝大蝦精闢的分析。小弟最近正在看FFserver的原始碼,看的有點頭大,有問題想請教一下。
我採用的是H.264的編碼器,我閱讀output_example後發現編碼後的資料格式應該是綁定到AVpacket格式上,我想問一下,ffserver是對什麼資料格式進行rtp打包的,是直接對編碼後的快取資料打包,還是對AVpacket資料進行rtp打包?
希望大哥能予以指點。

  • 回複

    樂 2009-03-02 13:38 我理解你這裡說的快取資料是feed1.ffm中的資料,那麼發出去的時候應該是從這裡取資料的,可以這樣理解,一幀解碼後的資料被在緩衝的時候,被拆分成一塊一塊(4096)的存放在feed1.ffm中,在要發送的時候,就把這一塊一塊的資料拼裝起來,還原為一幀解碼後的資料,交由AVpacket->data指向,再看要以什麼樣的格式發給用戶端,比如你這裡說的RTP,再把資料按照RTP格式打包,發送給用戶端。

  • 回複

    寧 2009-03-02 16:25 : 我理解你這裡說的快取資料是feed1.ffm中的資料,那麼發出去的時候應該是從這裡取資料的,可以這樣理解,一幀解碼後的資料被在緩衝的時候,被拆分成一塊一塊(40

    看到你的回複太高興了,非常感謝我還是有點不明白,還得再麻煩一下
    FFmpeg中的編碼函數應該是
    out_size = avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size,const AVFrame *pict);
    這時編碼後的資料放在buf裡,我想問一下這時buf裡的資料是不是應該是由一個一個的NALUnit組成的?
    如果是,我查看記憶體映像時發現只有最頭的資料是0x000001,以後的就都是普通資料了,也就是說,我編碼後的資料好像就只有一個NALUnit,但是我的輸入資料pict是一幀映像(網路攝影機採集到的一幀映像)應該由許多NALUnit組成啊,我想問一下這是什麼原因?是編碼的參數沒設定對嗎?
    因為我想對每一個NALUnit打包,如果是現在這種情況:每一個包是一幀資料,傳輸時也許會有很大的問題,麻煩您了!

  • 回複

    2009-03-02 17:02 : 看到你的回複太高興了,非常感謝我還是有點不明白,還得再麻煩一下
    FFmpeg中的編碼函數應該是
    out_size = avcodec_encode_video(AVCodecContext *avctx

    抱歉,這個我也不太清楚,你可以請教下admin,或是到論壇或群裡問問。

  • 回複

    2009-03-02 18:15 : 抱歉,這個我也不太清楚,你可以請教下admin,或是到論壇或群裡問問。

    恩,好的,還是非常感謝您

  • 回複

    2009-03-05 21:11 我想請問一下,FFmpeg有沒有做接收端?
    伺服器端用FFserver+FFmpeg,那麼接收端應該用什麼接收呢?
    除了VLC,我想問一下FFmpeg自己的接收端有類似FFserver的常式嗎?

  • 回複

    2009-03-05 21:18 呵呵,好像FFplay就是可以做用戶端嗎?
    FFplay可以接收網路來的rtp包嗎?然後自己解碼調用SDL顯示,是這樣嗎?
    謝謝王李樂

  • 回複

    2009-03-06 08:27 : 呵呵,好像FFplay就是可以做用戶端嗎?
    FFplay可以接收網路來的rtp包嗎?然後自己解碼調用SDL顯示,是這樣嗎?
    謝謝

    ffplay要播放從ffserver來的RTSP/RTP流的話,可能要改代碼了,不知道現在最新的ffplay能否直接播,就是類似ffplay rtsp://ip:5454/file這種形式,你可以試試。
    我原來試過ffmpeg編碼後的資料直接通過RTP發給用戶端,不經過ffserver,就是在服務端:
    ffmpeg -參數 ... rtp://client_ip:client_port?localport=server_port
    這樣的形式,用戶端用ffplay接收的時候類似於:
    ffplay rtp://server_ip:server_port?localport=client_port

  • 回複

    2009-03-06 11:49 恩,好的,明白了,謝謝大牛

  • 回複

    2009-04-23 22:14 你好!
    我使用ffserver命令啟動伺服器
    然後用ffmpeg -i bj.3gp -f flv http:localhost:8090/feed1.ffm
    在RealPlayer和VLC上都可以正確顯示頁面
    但卻無法正常播放請問您知道怎麼解決嗎?
    ffserver用的是源碼內建的ffserver .conf 謝謝!~

  • 回複

    2009-04-27 10:12 : 你好!
    我使用ffserver命令啟動伺服器
    然後用ffmpeg -i bj.3gp -f flv http:localhost:8090/feed1.ffm
    在RealPlayer和VLC上都可以正確顯示頁面
    但卻無法正常播放

    什麼叫正常顯示頁面,無法正常播放?
    用戶端請求的URL是什嗎?
    是否是3gp已經轉換完但用戶端的請求還未到?

  • 回複

    2009-04-29 09:51 在realplay中  輸入http://192.168.0.190:8090/stat.html 可以顯示
    FFServer Status
    Available Streams
    Path Served
    Conns
    bytes Format Bit rate
    kbits/s Video
    kbits/s
    Codec Audio
    kbits/s
    Codec Feed  
    test1.mpg  1  63  mpeg  96  64  mpeg1video  32  mp2  feed1.ffm  
    test.asf  3960  3094k asf_stream  320  256  msmpeg4  64  libmp3lame  feed1.ffm  
    stat.html  2  2142  -  -  -   -   
    index.html  0  0  -  -  -   -   

    Feed feed1.ffm
    Stream type kbits/s codec Parameters  
    0 audio 32 mp2 1 channel(s), 44100 Hz  
    1 video 64 mpeg1video 160x128, q=3-31, fps=3  
    2 audio 64 libmp3lame 1 channel(s), 22050 Hz  
    3 video 256 msmpeg4 352x240, q=3-31, fps=15  

    Connection Status
    Number of connections: 1 / 1000
    Bandwidth in use: 0k / 1000k
    # File IP Proto State Target bits/sec Actual bits/sec Bytes transferred  
    1 stat.html 192.168.0.95 HTTP/1.1 HTTP_WAIT_REQUEST 0  0  0  

    --------------------------------------------------------------------------------
    Generated at Wed Apr 29 09:41:07 2009
    然而頁面中的test1.mpg和test.asf都無法播放
    甚至在播放欄點選的時候 迅雷自動啟動 預設要下載test.asf和test1.mpg

    而在VLC中輸入192.168.0.190:8090/test.asf  或者192.168.0.190:8090/test1.mpg則一直顯示串連狀態 逾時 則彈出 您的輸入無法被開啟。。。
    3gp轉換和用戶端的開啟順序應該是如何的呢?我這裡不管是先轉換還是先開啟用戶端似乎都不能正確播放

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.