一、问题描述
使用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中绝对地址.