最近公司需要使用到流播放就选了bibili 的ijkplayer 库,之前播放rtmp 没什么问题。后来公司需要使用rtsp协议进行播放。使用ijkplayer 库播放,相同ip下不同端口。ijk播放的都是第一次播放的地址。
为了解决这个问题,查找了一些资料。原来是ffmpeg 的tcp连接上使用了域名来做缓存,最后修改成域名加端口做缓存才解决这个问题
1.可以直接替换库
https://github.com/huangzhentong/ijkplayerDNSFramework.git
2。可以自己制作库
参照
https://www.jianshu.com/p/9743a68c2939
在编译 ffmpeg库之前先修改缓存代码
在iOS->ffmpeg-arm64 ->libavformat 文件下找到tcp.c文件夹
找到tcp_open 及 tcp_fast_open方法 直接搜索 get_dns_cache_reference 方法 将下面代码替换
if(s->dns_cache_timeout >0) {
memcpy(hostname_bak, hostname,1024);
if(s->dns_cache_clear) {
av_log(NULL, AV_LOG_INFO,"will delete cache entry, hostname = %s\n", hostname_bak);
remove_dns_cache_entry(hostname);
}else{
dns_entry = get_dns_cache_reference(hostname);
}
}
替换成
if(s->dns_cache_timeout >0) {
memcpy(hostname_bak, hostname,1024);
strcat(hostname_bak, portstr);
if(s->dns_cache_clear) {
av_log(NULL, AV_LOG_INFO,"will delete cache entry, hostname = %s\n", hostname_bak);
remove_dns_cache_entry(hostname_bak);
}else{
dns_entry = get_dns_cache_reference(hostname_bak);
}
}
其他几个ffmpeg 文件夹也要做同样的步骤
把所有的tcp.c文件修改完再 # 编译ffmpeg
./compile-ffmpeg.sh all
编译完再打包framework
网友评论