zoukankan      html  css  js  c++  java
  • FFMPEG类库打开流媒体的方法(需要传参数的时候)

    使用ffmpeg类库进行开发的时候,打开流媒体(或本地文件)的函数是avformat_open_input()。

    其中打开网络流的话,前面要加上函数avformat_network_init()。

    一般情况下,只要传入流媒体的url就可以了。但是在打开某些流媒体的时候,可能需要附加一些参数。

    例如在播放中央人民广播电台的声音信号的时候,其url为“rtsp://mms.cnr.cn/cnr003?MzE5MTg0IzEjIzI5NjgwOQ==”

    如果直接进行打开是不会成功的,我们可以使用ffplay做一下实验:

    会出现错误:

    Invalid data found when processing input

    这时候我们需要指定其传输方式为TCP,需要将命令改为如下形式:

    附加了参数以后,发现就可以正常播放了。

    此外还可以附加一些参数,比如

    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()的定义:

    01 /**
    02  * Open an input stream and read the header. The codecs are not opened.
    03  * The stream must be closed with av_close_input_file().
    04  *
    05  * @param ps Pointer to user-supplied AVFormatContext (allocated by avformat_alloc_context).
    06  *           May be a pointer to NULL, in which case an AVFormatContext is allocated by this
    07  *           function and written into ps.
    08  *           Note that a user-supplied AVFormatContext will be freed on failure.
    09  * @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);

    可以看出avformat_open_input()的第4个参数是一个AVDictionary类型的参数。这个参数就是传入的附加参数。

    设置AVDictionary的时候会用到av_dict_set()。

    下面看看把命令

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

    转化为代码实现的方式:

    01 AVFormatContext *pFormatCtx;
    02 pFormatCtx = avformat_alloc_context();
    03 ...代码略
    04 AVDictionary *avdic=NULL;
    05 char option_key[]="rtsp_transport";
    06 char option_value[]="tcp";
    07 av_dict_set(&avdic,option_key,option_value,0);
    08 char option_key2[]="max_delay";
    09 char option_value2[]="5000000";
    10 av_dict_set(&avdic,option_key2,option_value2,0);
    12  
    13 avformat_open_input(&pFormatCtx,url,NULL,&avdic);



    rtsp测试地址:

    ffplay version N-79440-g0efafc5版本已经支持
    ffplay rtsp://218.204.223.237:554/live/1/66251FC11353191F/e7ooqwcfbqjoo80j.sdp


    Keep it simple!
    作者:N3verL4nd
    知识共享,欢迎转载。
  • 相关阅读:
    axios
    JavaScript ES6部分语法
    JSP 基础之 JSTL <c:forEach>用法
    JS ajxa请求 返回数据
    java中的各种数据类型在内存中存储的方式
    sql之left join、right join、inner join的区别
    错误”ORA-12560: TNS: 协议适配器错误“解决方法
    Hibernate 和 Mybatis的区别
    eclipse启动几秒后报错 (一闪而过)
    sql ---- count 误区
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5834694.html
Copyright © 2011-2022 走看看