最近做到了直播这块,后台提供的是RTSP视频流,考虑到开发速度就采用了IJKPlayer,但是默认的编译配置是没有支持RTSP的,需要去修改配置和部分代码来支持。
1、首先clone下来IJKPlayer,很简单;
2、切换到config文件夹下,修改module-lite.sh文件:
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtp" #修改
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rtsp" #添加
然后删除config文件夹下的module.sh,重新创建链接
ln -s module-lite.sh module.sh
3、修改源文件ijkmedia->ijkplayer->ff_ffplay.c找到下面的代码
static int packet_queue_get_or_buffering(FFPlayer *ffp, PacketQueue *q, AVPacket *pkt, int *serial, int *finished)
{
assert(finished);
if (!ffp->packet_buffering)
return packet_queue_get(q, pkt, 1, serial);
while (1) {
int new_packet = packet_queue_get(q, pkt, 0, serial);
if (new_packet < 0)
return -1;
else if (new_packet == 0) {
if (q->is_buffer_indicator && !*finished)
ffp_toggle_buffering(ffp, 1);
new_packet = packet_queue_get(q, pkt, 1, serial);
if (new_packet < 0)
return -1;
}
if (*finished == *serial) {
av_packet_unref(pkt);
continue;
}
else
break;
}
return 1;
}
修改为下面的代码
static int packet_queue_get_or_buffering(FFPlayer *ffp, PacketQueue *q, AVPacket *pkt, int *serial, int finished){
while (1) {
int new_packet = packet_queue_get(q, pkt, 1, serial);
if (new_packet < 0){
new_packet = packet_queue_get(q, pkt, 0, serial);
if(new_packet < 0)
return -1;
}else if (new_packet == 0) {
if (!finished)
ffp_toggle_buffering(ffp, 1);
new_packet = packet_queue_get(q, pkt, 1, serial);
if (new_packet < 0)
return -1;
}
if (finished == *serial) {
av_free_packet(pkt);
continue;
}
else
break;
}
return 1;
}
4、开始编译
根目录执行 ./init-ios.sh 下载所需要的库
ios目录执行 ./compile-ffmpeg.sh clean 清理一下
ios目录执行 ./compile-ffmpeg.sh all 开始编译,等待。。
5、编译成功进入ios->IJKMediaPlayer文件夹,打开工程,分别在模拟器和真机环境下编译一遍
6、合并静态库
lipo -create ~/Desktop/1/IJKMediaFramework.framework/IJKMediaFramework ~/Desktop/2/IJKMediaFramework.framework/IJKMediaFramework -output ~/Desktop/IJKMediaFramework
然后将得到的这个静态文件复制到上面两个路径任何一个中,就得到了我们想要的静态IJKPlayer开发包。
多谢,经实验好用