美文网首页
Dash流MPD文件适配init文件绝对地址

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

作者: 萤火虫_629e | 来源:发表于2021-12-14 14:15 被阅读0次

一、问题描述

使用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流MPD文件适配init文件绝对地址

      本文链接:https://www.haomeiwen.com/subject/rrftfrtx.html