FFMPEG類庫開啟流媒體的方法(傳參數)

來源:互聯網
上載者:User

標籤:

使用ffmpeg類庫進行開發的時候,開啟流媒體(或本地檔案)的函數是avformat_open_input()。

其中開啟網路流的話,前面要加上函數avformat_network_init()。

一般情況下,只要傳入流媒體的url就可以了。但是在開啟某些流媒體的時候,可能需要附加一些參數。

例如在播放中央人民廣播電台的聲音訊號的時候,其url為“rtsp://mms.cnr.cn/cnr003?MzE5MTg0IzEjIzI5NjgwOQ==”

如果直接進行開啟是不會成功的,我們可以使用ffplay做一下實驗:

 

  1. ffplay rtsp://mms.cnr.cn/cnr003?MzE5MTg0IzEjIzI5NjgwOQ==  
會出現錯誤:

 

Invalid data found when processing input

這時候我們需要指定其傳輸方式為TCP,需要將命令改為如下形式:

 

  1. ffplay -rtsp_transport tcp rtsp://mms.cnr.cn/cnr003?MzE5MTg0IzEjIzI5NjgwOQ==  

附加了參數以後,發現就可以正常播放了。

 

此外還可以附加一些參數,比如

 

  1. ffplay -rtsp_transport tcp -max_delay 5000000 rtsp://mms.cnr.cn/cnr003?MzE5MTg0IzEjIzI5NjgwOQ==  

在使用FFMPEG類庫進行編程的時候,如何將這些附加的參數傳遞給avformat_open_input()呢?經過研究後發現,可以通過AVDictionary把參數傳給avformat_open_input()。

 

看一下avformat_open_input()的定義:

 

  1. /** 
  2.  * Open an input stream and read the header. The codecs are not opened. 
  3.  * The stream must be closed with av_close_input_file(). 
  4.  * 
  5.  * @param ps Pointer to user-supplied AVFormatContext (allocated by avformat_alloc_context). 
  6.  *           May be a pointer to NULL, in which case an AVFormatContext is allocated by this 
  7.  *           function and written into ps. 
  8.  *           Note that a user-supplied AVFormatContext will be freed on failure. 
  9.  * @param filename Name of the stream to open. 
  10.  * @param fmt If non-NULL, this parameter forces a specific input format. 
  11.  *            Otherwise the format is autodetected. 
  12.  * @param options  A dictionary filled with AVFormatContext and demuxer-private options. 
  13.  *                 On return this parameter will be destroyed and replaced with a dict containing 
  14.  *                 options that were not found. May be NULL. 
  15.  * 
  16.  * @return 0 on success, a negative AVERROR on failure. 
  17.  * 
  18.  * @note If you want to use custom IO, preallocate the format context and set its pb field. 
  19.  */  
  20. int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options);  
/** * Open an input stream and read the header. The codecs are not opened. * The stream must be closed with av_close_input_file(). * * @param ps Pointer to user-supplied AVFormatContext (allocated by avformat_alloc_context). *           May be a pointer to NULL, in which case an AVFormatContext is allocated by this *           function and written into ps. *           Note that a user-supplied AVFormatContext will be freed on failure. * @param filename Name of the stream to open. * @param fmt If non-NULL, this parameter forces a specific input format. *            Otherwise the format is autodetected. * @param options  A dictionary filled with AVFormatContext and demuxer-private options. *                 On return this parameter will be destroyed and replaced with a dict containing *                 options that were not found. May be NULL. * * @return 0 on success, a negative AVERROR on failure. * * @note If you want to use custom IO, preallocate the format context and set its pb field. */int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options);


可以看出avformat_open_input()的第4個參數是一個AVDictionary類型的參數。這個參數就是傳入的附加參數。

 

設定AVDictionary的時候會用到av_dict_set()。

下面看看把命令

 

  1. ffplay -rtsp_transport tcp -max_delay 5000000 rtsp://mms.cnr.cn/cnr003?MzE5MTg0IzEjIzI5NjgwOQ==  

 

轉化為代碼實現的方式:

 

  1. AVFormatContext *pFormatCtx;  
  2. pFormatCtx = avformat_alloc_context();  
  3. ...代碼略  
  4. AVDictionary *avdic=NULL;  
  5. char option_key[]="rtsp_transport";  
  6. char option_value[]="tcp";  
  7. av_dict_set(&avdic,option_key,option_value,0);  
  8. char option_key2[]="max_delay";  
  9. char option_value2[]="5000000";  
  10. av_dict_set(&avdic,option_key2,option_value2,0);  
  11. char url[]="rtsp://mms.cnr.cn/cnr003?MzE5MTg0IzEjIzI5NjgwOQ==";  
  12.   
  13. avformat_open_input(&pFormatCtx,url,NULL,&avdic);  

FFMPEG類庫開啟流媒體的方法(傳參數)

相關文章

聯繫我們

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