bilibili / ijkplayer

Android/iOS video player based on FFmpeg n3.4, with MediaCodec, VideoToolbox support.
GNU General Public License v2.0
32.59k stars 8.14k forks source link

HLS请求的url长字符串被截断的问题 #79

Closed jgfntu closed 10 years ago

jgfntu commented 10 years ago

ffmpeg的分支ijk-r.0.1.2-dev到ijk-r.0.1.3-dev之间,出现了一个问题,例如请求一个HLS地址:http://gslb.tv.sohu.com/live?cid=3&type=hls,因为这个地址有重定向,variant的地址如http://119.147.159.246:80/sohu/s26h23eab6/playlist/3.m3u8?key=uO-VXbn7x81ynAVUXYMjf5TVTVabg3J6qWdwcg..&ver=seg&n=1&a=1803&cip=183.13.91.164,多了一些参数,总的现象是播放十几秒之后,卡住不动了(集成到ijkplayer里面上报的是播放结束事件)。

调试发现,hls.c中的hls_read_header()函数里面,在Open the demuxer for each playlist的循环里面,调用了avformat_find_stream_info(pls->ctx, NULL);之后,pls->url的地址就被截断了,调试了几次,好像长度都是固定的103个字符,类似于这样http://119.147.159.246:80/sohu/s26h23eab6/playlist/3.m3u8?key=uO-VXbn7x81ynAVUXYMjf5TVTVabg3J6qWd�裛�,导致再次请求playlist的时候报错了,等于只是播放了前面的3个segment。

发现两次tag之间修改了一些avformat/avio.c代码,但是,我没找到之间的联系,不清楚是哪里引入的问题,可否帮助查看下,谢谢~

bbcallen commented 10 years ago

https://github.com/bbcallen/FFmpeg/commit/66696b66c09de97955301ea0ad896bcd80957341 已经在 ffmpeg 的 fork 中屏蔽了有问题的代码,运行 init-ios.sh 更新 ffmpeg 即可。 下个 release-tag 会彻底去掉有问题的代码。

jgfntu commented 10 years ago

Thanks!屏蔽掉是可以了。不过有点困惑,这行代码不知如何跟pls->url联系起来,并修改了其值的。

bbcallen commented 10 years ago

这个函数的实现里取了AVIOContext的opaque字段,并假定是URLContext。不过在HLS的实现中,opaque是一个完全不同的结构体,刚好把url覆盖了。