Dash流MPD文件适配init文件绝对地址

一、问题描述

使用ijkplayer播放mpd Dash流时,当init文件或者media文件地址是http://之类的绝对地址时,ffmpeg会自动拼接前缀例如http://xxxx.com/http://xxx.mpd,那么这样是有问题的,在Linux上使用最新版本的ffmpeg ffplayer试着播放mpd时,又没有出现这个问题,定位到是ffmpeg版本问题,官方应该是在最新版本的ffmpeg中修复了这个问题,由于ijkplayer切换ffmpeg版本过于麻烦,故直接修改ffmpeg相应地方的源码来修复问题.

二、问题修复

经过分析,最终定位到在dashdec.c文件中解析mpd文件,最终在get_content_url发现两个版本的ffmpeg代码有些不一样,修改后如下:

static char *get_content_url(xmlNodePtr *baseurl_nodes,

                             int n_baseurl_nodes,

                             int max_url_size,

                             char *rep_id_val,

                             char *rep_bandwidth_val,

                             char *val)

{

    int i;

    char *text;

    char *url = NULL;

    char *tmp_str = av_mallocz(max_url_size);

    char *tmp_str_2 = av_mallocz(max_url_size);


    if (!tmp_str || !tmp_str_2) {

        return NULL;

    }


    for (i = 0; i < n_baseurl_nodes; ++i) {

        if (baseurl_nodes[i] &&

            baseurl_nodes[i]->children &&

            baseurl_nodes[i]->children->type == XML_TEXT_NODE) {

            text = xmlNodeGetContent(baseurl_nodes[i]->children);

            if (text) {

                memset(tmp_str, 0, max_url_size);

                memset(tmp_str_2, 0, max_url_size);

                ff_make_absolute_url(tmp_str_2, max_url_size, tmp_str, text);

                av_strlcpy(tmp_str, tmp_str_2, max_url_size);

                xmlFree(text);

            }

        }

    }

    if (val)

        ff_make_absolute_url(tmp_str, max_url_size, tmp_str, val);


    if (rep_id_val) {

        url = av_strireplace(tmp_str, "$RepresentationID$", (const char*)rep_id_val);

        if (!url) {

            goto end;

        }

        av_strlcpy(tmp_str, url, max_url_size);

    }

    if (rep_bandwidth_val && tmp_str[0] != '\0') {

        // free any previously assigned url before reassigning

        av_free(url);

        url = av_strireplace(tmp_str, "$Bandwidth$", (const char*)rep_bandwidth_val);

        if (!url) {

            goto end;

        }

    }

end:

    av_free(tmp_str);

    av_free(tmp_str_2);

    return url;

}

修改代码后重新编译运行,能正常播放网络dash中绝对地址.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • -dash持续时间:使用给定的段持续时间启用输入文件的DASH分段。对于onDemand配置文件,其中每个媒体演示...
    D_R_M阅读 4,889评论 2 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • window_size 默认值:int:0 — 取值范围:[0, int_max]--清单中保留的最大段数 ex...
    D_R_M阅读 6,099评论 0 0
  • ● 如何打印二叉树每层的节点? 考察点:二叉树 参考回答: 实现代码: import java.util.Arra...
    le_u阅读 511评论 0 0
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,521评论 0 13