基于ffmpeg的播放器起播延迟优化

一个视频的播放,播放器的执行步骤大致如下:读取原始数据、解复用、解码、显示。对于vlc和ijk播放器的编解码部分都是使用ffmpeg,在这里以开源项目ijkplayer为例分析播放器在读取原始数据后的解码执行步骤:
1. avformat_open_input()该函数用于打开多媒体数据并且获得一些相关的信息,声明位置libavformat\avformat.h,函数执行成功的话,其返回值大于等于0。该函数调用成功之后会对结构体AVFormatContext进行一些处理。
   int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
    ps:函数调用成功之后处理过的AVFormatContext结构体。
    file:打开的视音频流的URL。
    fmt:强制指定AVFormatContext中AVInputFormat的。这个参数一般情况下可以设置为NULL,这样FFmpeg可以自动检测AVInputFormat。
    dictionay:附加的一些选项,一般情况下可以设置为NULL。

2. avformat_find_stream_info()函数可以读取一部分视音频数据并且获得一些相关的信息。函数正常执行后返回值大于等于0。
   int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
   ic:输入的AVFormatContext。
   options:额外的选项,目前没有深入研究过。
   该函数上下文部分是调节起播延迟效果最明显的地方。函数分析流的时间主要由传入的AVFormatContext的probesize 和 max_analyze_duration两个属性决定,probesize是探测读入大小,默认值为32K;max_analyze_duration默认值为5S。在网络状况比较好的情况下可分别设置4K和1S,也可根据具体情况在起播画面效果、起播延迟、分析成功率等因素间取舍。这两个参数的设置在avformat_open_input()函数对结构体AVFormatContext处理完成后进行设置。

3. 对于解码过程中后面执行的av_read_frame() 、avcodec_decode_video2()等函数,目前还未发现针对起播延迟的可优化地方。后面继续补充。


上面提到的probesize的设置,在调用者初始化播放器时,可由外面传入设置,

你可能感兴趣的:(C/C++,流媒体)