av_interleaved_write_frame退出較慢

來源:互聯網
上載者:User

標籤:

用libvlc做直播推流引擎
在網路較差的情況下,需要關閉直播,並且重新開播。
這個過程中,推流引擎重啟,需要的是快速響應。
實際上測試結果發現,經常會發生引擎關閉介面卡住。
後來跟蹤代碼,定位到s_rtmp_send_thread() 中
其中一句:
ret = av_interleaved_write_frame(formatContext, pkt);
這個方法在網路較好的情況下,一般是幾個毫秒就返回傳送成功。
然後在網路較差的情況下,會一直卡在這裡,沒有返回。。。

跟蹤ffmpeg代碼,這個方法的實現在mux.c
libavformat/mux.c
av_interleaved_write_frame()
write_packet() 真正寫資料
ret = s->oformat->write_packet(s, pkt);
write_packet 這裡就是一個定義在avformat.h中的指標,指向flv_write_packet()

經一步跟蹤代碼,發現關於網路讀寫的逾時控制,定義在url.h中

typedef struct URLContext {......int64_t rw_timeout; /**< maximum time to wait for (network) read/write ......} URLContext;

於是在初始化的地方,設定這個參數:

libavformat/avio.c --->
url_alloc_for_protocol() return之前添加如下語句

// 網路讀寫逾時 控制在 800ms

if (0 == uc->rw_timeout || uc->rw_timeout > 800000)        uc->rw_timeout = 800000;

回到項目中,在av_interleaved_write_frame兩端輸出時間,發現現在這個介面在網路不好的情況下,基本控制在1s以內。然後並不是精確的時間控制。貌似ffmpeg本身都不能嚴格控制到毫秒層級。

為了確保這個返回一定得到響應,同時在libavformat/mux.c
av_interleaved_write_frame()中修改下面的代碼:

for(;;) 

這個沒有控制的for迴圈,改為

int mOutTimes = 128;int nn;for(nn=0;nn<mOutTimes;nn++)

這裡的128是個經驗值。

av_interleaved_write_frame退出較慢

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.