官网:https://github.com/Bilibili/ijkplayer
今天闲下来,把以前做RTSP的过程简单整理下。
详细的图文步骤网络上有很多,但大多是RTMP等的,这里简单记录一下RTSP的部分,由于IJKPlayer默认不支持RTSP,需要改些配置。
转载请注明出处 ethan_xue博客
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios
cd ijkplayer-ios
git checkout -B latest k0.8.0
修改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"
保存后
cd /Users/xue/Downloads/RTSP/ijkplayer-ios/config
rm module.sh //删除原来的
ln -s module-lite.sh module.sh //用修改过的替换
ijkplayer-ios/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;
}
./init-ios.sh
cd ios
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
打开xcode编译模拟器和真机,分别编译一遍。
将编译出来的库进行合并
xuedeiMac:Products xue$ lipo -create Release-iphoneos/IJKMediaFramework.framework/IJKMediaFramework Release-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework -output IJKMediaFramework
得到想要的framework
IJKDemoInputURLViewController.m里
url = [NSURL URLWithString:@"rtsp://39.xx.x3.x:556/realplay://bca32cf8bb2e4a1a95aeb294bf536328:SUB:TCP?cnid=1&pnid=0&token=&auth=30&redirect=0&transcode=0&resolution=2&bitrate=100&framerate=10&videotype=2&systemformat=2"];
// if ([scheme isEqualToString:@"http"]
// || [scheme isEqualToString:@"https"]
// || [scheme isEqualToString:@"rtmp"]) {
IJKVideoViewController.m里
// 使用 TCP
[options setOptionValue:@"tcp" forKey:@"rtsp_transport" ofCategory:kIJKFFOptionCategoryFormat];
// [options setPlayerOptionIntValue:1 forKey:@"videotoolbox"];
ffmpeg的配置只需要在
[options setFormatOptionValue:@"tcp" forKey:@"rtsp_transport"];
//[options setOptionValue:@"tcp" forKey:@"rtsp_transport" ofCategory:kIJKFFOptionCategoryFormat];
// 使用硬解
[options setPlayerOptionIntValue:1 forKey:@"videotoolbox"];
ijkplayer ios项目集成(图文详细版) http://www.jianshu.com/p/4f21af680c19
力扣LeetCode:Python解题 — 1.两数之和两数之和解法一:双循环解法二:缓存数值结果对比两数之和难度:简单给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]解法一:双
缺少背景音乐和音效的游戏是不完整的。首先定义两个变量,一个用来播放背景音乐,一个用来播放音效[java] view plaincopyprivate Music mMusic; private Sound mSound; AndEngine中播放声音需要在onCreateEngineOptions()方法里_soundfactory.createsoundfromasset()
题目描述118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不同纯度的成品分开装箱,装箱员grant第1次顺序从流水线上取10个成品(如果一共不足10个,则全部取出),以后每一次把手中某种纯度的成品放进相应的箱子,然后再从流水线上顺序取一些成品,...
1、停卡 Nginx 容器docker stop nginx2、查看 Nginx 容器Iddocker inspect nginx | grep "Id"# 返回"Id": "b5ec8ed792bfb2392b6f42ca32f8d7791e57f7b961bfca1c82cf7014ac36cf16",3、修改vim /var/lib/docker/conta..._docker修改80端口
图片是在网上找的dev_close_window ()dev_open_window (0, 0, 512, 512, 'black', WindowHandle)read_image (Image, 'E:/halcon学习笔记/遥控器 温度识别/20190608130746466.png')rgb1_to_gray (Image, GrayImage)draw_rectang..._halcon显示数字
在网页上拿到的json数据:{"success":"true"}uni.resquest 拿到的数据:console.log(res.data) 输出{success: "true"}success没有双引号。百度了一圈也没找到原因。后来试了试console.log(JSON.stringify(res.data)),发现输出{"success":"true"},..._uniapp 封装接口返回code 和浏览器返回code 不一样
在gradle的使用过程中,会和maven一样存在A模块引用B模块的问题,今天在项目中遇到了,在此做个记录,供自己日后回顾,复习先看一下maven的模块依赖khxt希望可以引入common-code,只需要在khxt的pom.xml中将其引用即可。gradle的模块依赖,其原理和maven差不多,语法不一样khxt子模块,需要引用common-code父模块下配置子模块名需要将common-code,在gradle中打成jar包,之后在khxt模..._gradle 使用子项目的包
事件日志的报告 此时 MySql Server 所在服务器上,Windows 事件日志出现了如下错误: 事件类型: 警告事件来源: MySQL事件种类: 无事件 ID: 100日期: 2010-01-01事件: 11:29:13用户: N/A计算机: SERVERII描述:IP address '100.ZZZ.YY_code: 11004
后台站长-->ue设置 点击提交 清楚缓存即可_discuz 图片 localhost
四级渣渣看个英文文章简直就是自虐,一天只能看一点,还只能看个半懂。唉,写下来以后慢慢理解改正吧。目录一、Motivation 二、基础知识 1.平稳性 2.序列相关(自相关) 3.为什么我们关心序列相关性? 三、白噪声和随机游动 四、线性模型 五、对数线性模型 六、AR模型(P) 七、移动平均模型MA(q) 八、自回归滑动平均模型ARMA(p,
bug场景:后端传递实体类给前端,数据库中主键为bigint,java类中为long类型。从数据库中查出后返回给前端展示,结果精度丢失。问题分析:vue前端对long类型的精度无法接收,javascript 的 Number 类型最大长度是17位,mysql 使用bigint 类型长度是20位。解决方案:返回给前端前通过配置类进行long类型转换string,避免精度丢失。/*** 创建配置类,对返回给前端的数据类型进行转换,long类型转换为String,避免前端造成的精度丢失*/@_vue long
作用分层的K折交叉验证器。提供训练/测试索引以将数据拆分为训练/测试集。此交叉验证对象是KFold的变体,它返回分层的折痕。折叠是通过保留每个类别的样品百分比来进行的。参数解析n_splits int,默认= 5折数。必须至少为2。在0.22版中更改:n_splits默认值从3更改为5。shuffle bool,默认= False在拆分成批次之前是否对每个班级的样本进行混洗。请注意,每个拆分内的样本都不会被混洗。random_state int,RandomState实例或无,_stratifiedkfold random_state