IOS 集成 Bilibili IJKPlayer播放器,播放rtmp视频流
因为公司项目需要,我一个连iPhone都没用过的人竟然跑去开发iOS APP。近一段时间一直忙于赶项目,到今天差不多了,所以记录一下当时遇到的各种坑,先从ios 集成 ijkplayer播放器说起!
首先感谢网络上各位大神,感谢开源精神!!!
进入正题,因为项目需要,我要在iOS上开发一套 rtmp 视频流的播放器,最开始公司大佬推荐的VLC。几经辗转再 pod 上找到了 VLC的播放器包,但是引入之后效果并不理想,最主要的原因就是VLC播放一段时间之后,图像就卡住不动了,而且延迟无比大,不知道是我的参数没有调整好还是VLC这个播放器自身的原因。在度娘的牵线下,果断放弃VLC,投入了B站大大的ijkplayer之中!
不得不说,B站大大是真狠,我以为像是VLC那种在 pod 一顿查找,没有找到。最后上 github 终于找到了解决方案(这里感谢一下 航哥 大佬,教程很详细。)
编译的过程我就不再详细赘述了,毕竟航哥大佬写的已经很详细了,每一步都很细致。奉上编译具体操作步骤:https://blog.csdn.net/baidu_36600645/article/details/106025962
但是其中有一个问题,我编译之后也是按照大佬的包引入的,但是我运行的时候报了一个错误。经过查找,我发现是我少引了一个包(大佬的文章中没有写,可能是因为时间的原因,苹果对包进行了更改,所以还要添加一个包 libc++.tbd)
引入的包在下面列出来了:
AudioToolbox.framework
AVFoundation.framework
CoreGraphics.framework
CoreMedia.framework
CoreVideo.framework
libbz2.tbd
libz.tbd
libc++.tbd
MediaPlayer.framework
MobileCoreServices.framework
OpenGLES.framework
QuartzCore.framework
UIKit.framework
VideoToolbox.framework
libc++.tbd 这个包名我给标出来啦!各位兄弟要注意呦!
接下来就是大佬的代码,因为我用的是 swift5.0 所以可能跟大佬的代码有些许差异,大家直接复制大佬的代码到 xcode 中也是可以的(这就不得不说 Xcode 是真的牛逼,过期的变量、函数都会有提示,而且有自动转换的方法【一条条红线后面都带有 fix 按钮,真的牛逼!】)
把我的代码也贴下来,方便大家面向博客园编程(其中有小规模更改,主要是为了保证播放的延迟降低到1s左右【Ps:就这样我的产品经理告诉我,你能不能把延迟降低到500ms一下,我想怼死他!】):
//
// ScreenLiveViewController.swift
// OneClass
//// import UIKit
import IJKMediaFramework class ScreenLiveViewController: UIViewController { var player:IJKFFMoviePlayerController! override var preferredStatusBarStyle: UIStatusBarStyle{
return UIStatusBarStyle.darkContent
} override func viewDidLoad() {
super.viewDidLoad()
let session:AVAudioSession = AVAudioSession.sharedInstance()
//设置录音类型
try! session.setCategory(AVAudioSession.Category.ambient)
//设置支持后台
try! session.setActive(true) let options = IJKFFOptions.byDefault() // // 缩短播放的rtmp视频延迟在1s内
options?.setOptionIntValue(100, forKey: "analyzemaxduration", of: kIJKFFOptionCategoryFormat)
options?.setOptionIntValue(10240, forKey: "probesize", of: kIJKFFOptionCategoryFormat)
options?.setOptionIntValue(1, forKey: "flush_packets", of: kIJKFFOptionCategoryFormat)
options?.setOptionValue("nobuffer", forKey: "fflags", of: kIJKFFOptionCategoryFormat)
options?.setOptionIntValue(1, forKey: "videotoolbox", of: kIJKFFOptionCategoryPlayer)
options?.setOptionIntValue(0, forKey: "packet-buffering", of: kIJKFFOptionCategoryPlayer)
options?.setOptionIntValue(1, forKey: "framedrop", of: kIJKFFOptionCategoryPlayer) //视频源地址
let url = URL(string: "rtmp://你的地址") //初始化播放器,播放在线视频或直播(RTMP)
let player = IJKFFMoviePlayerController(contentURL: url, with: options)
//播放页面视图宽高自适应
let autoresize = UIView.AutoresizingMask.flexibleWidth.rawValue |
UIView.AutoresizingMask.flexibleHeight.rawValue
player?.view.autoresizingMask = UIView.AutoresizingMask(rawValue: autoresize) player?.view.frame = self.view.bounds// player?.scalingMode = .aspectFit //缩放模式
player?.shouldAutoplay = true //开启自动播放 // self.view.autoresizesSubviews = true
self.view.addSubview((player?.view)!)
self.player = player } override func viewWillAppear(_ animated: Bool) {
//开始播放
self.player.prepareToPlay()
} override func viewWillDisappear(_ animated: Bool) {
//关闭播放器
self.player.shutdown()
} override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
其中有些神奇的写法,大家取其精华去其糟粕。
其中出现了一段神奇的操作,最开始我害怕我加 ijkplayer 播放器会把我原来的代码搞坏,所以我直接新建了一个新的项目,经过上面的操作都没有问题,但是当我一直到了新项目,我的天
就是报错:
aout_pause_audio(1)
aout_pause_audio(0)
aout_pause_audio(1)
aout_pause_audio(0)
aout_pause_audio(1)
aout_pause_audio(0)
aout_pause_audio(1)
aout_pause_audio(0)
aout_pause_audio(1)
aout_pause_audio(0)
...
一直是这两个循环,我调了一下午都没有搞明白原因,后来我猛然看到我的项目当中那显眼的 VLC 。。。我就知道了,此事不简单啊!
后来把 VLC包删除之后,终于恢复了正常!
IOS 集成 Bilibili IJKPlayer播放器,播放rtmp视频流的更多相关文章
- 使用vlc播放器播放rtsp流视频
可参考: 使用vlc播放器做rtsp服务器 web网页中使用vlc插件播放相机rtsp流视频 使用vlc进行二次开发做自己的播放器 首先需要安装vlc播放器,下载及安装步骤略 使用vlc播放器播放rt ...
- 【转】C# 视频监控系列(12):H264播放器——播放录像文件
原文地址:http://www.cnblogs.com/over140/archive/2009/03/23/1419643.html?spm=5176.100239.blogcont51182.16 ...
- 如何实现Windows平台RTMP播放器/RTSP播放器播放窗口添加OSD文字叠加
好多开发者在做Windows平台特别是单屏多画面显示时,希望像监控摄像机一样,可以在播放画面添加OSD台标,以实现字符叠加效果,大多开发者可很轻松的实现以上效果,针对此,本文以大牛直播SDK (Git ...
- RTSP播放器或RTMP播放器常用的Evnet事件回调设计
很多开发者在开发RTSP或RTMP播放器的时候,不晓得哪些event回调事件是有意义的,针对此,我们以大牛直播SDK(github)的Android平台RTSP/RTMP直播播放端为例,简单介绍下常用 ...
- EasyPlayer-RTSP-Android安卓播放器播放RTSP延迟优化策略,极低延时!
EasyPlayer-RTSP-Android安卓RTSP播放器低延迟播放延时优化策略 EasyPlayer-RTSP-Android播放器是一款专门针对RTSP协议进行过优化的流媒体播放器,其中我们 ...
- .net C# 网页播放器 支持多种格式 媒体播放器 播放器 代码
.avi格式代码片断如下:<object id='video' width='400' height='200' border='0' classid='clsid:CFCDAA03-8BE4- ...
- 第十一篇、HTML5隐藏播放器播放背景音乐
html5添加网页背景音乐 一个客户要求给网站添加一个背景音乐,我用的是html5添加网页背景音乐的代码,在此记录一下以后有用. html5方法一:<audio autoplay=" ...
- flv网页播放器播放失败
在IIS6.0上发布网站时,在路径正确的情况下,网页flv播放器还是无法播放flv视频的解决方法. 1.打开IIS6.0管理器,打开发布的网站,点击打开属性窗口. 2.在HTTP头选项里找到MIME类 ...
- java调用本地播放器播放视频文件。调用本地播放器不能播放指定文件的说明。
public class OpenExe extends HttpServlet { //打开本地播放器并播放视频 public static void openExe(String file) { ...
随机推荐
- 记一次jenkins svn构建过程
本文主要参考:maven实战第11章Hudson持续集成 安装Hudson,Hudson插件下载不了,尝试结果未果,转而使用Jenkins 放入tomcat的webapp目录,在bin下点击start ...
- 10分钟物联网设备接入阿里云IoT平台
前言最近尝试了一下阿里云IoT物联网平台,还是蛮强大的.在此记录一下学习过程.本教程不需要任何外围硬件,一台电脑和一根能上网的网线即可.算是一篇Hello World了.先上效果图 第一章 准备工作1 ...
- onethink-i春秋
记一道onethink漏洞拿flag的题. 因为用户名长度被限制了,注册两个账号分别为 %0a$a=$_GET[a];// %0aecho `$a`;// #(%0a是换行符的urlencode) 点 ...
- 字节跳动已经10万人了?渣本双非Android程序员怎么上车?
字节跳动已经 10 万人了? 是的,在 2020 年字节跳动的员工总数从 6 万蹿到 10 万,平均每个工作日就有 150 人在办理入职,加入字节跳动全球超过 240 个办公点. 更有统计,在总部北京 ...
- Java代码操作zookeeper
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- 计算机专业学了快一年, 只会一点C语言,你好意思说自己是IT专业的?
目录 一.C/C++入门阶段 学习视频推荐:C++入门基础[B站 小甲鱼] 二.C/C++开发进阶 学习视频推荐:C++进阶[慕课网 免费课] 三.C++开发高级 视频教程:程序设计[中国大学MOOC ...
- 关于shell脚本——echo、for语句、while语句、until语句
目录 一.echo 1.1.echo命令用法 1.2.echo截取字符 二.for语句 2.1.实例 创建用户名文件 创建脚本文件 运行脚本 三.while语句 3.1.实例 创建脚本文件 运行脚本 ...
- windows和linux传输小技巧——FTP服务
目录 一.FTP简介 二.匿名用户访问设置 三.设置本地用户验证访问ftp 3.1.修改匿名用户.本地用户登录的默认根目录 四.使用user_list列表 一.FTP简介 FTP服务--用来传输文件的 ...
- sqli-labs lesson5-6 布尔盲注 报错注入 延时注入
LESSON 5: 典型的布尔盲注. 盲注:sql注入过程中,sql语句的执行结果不回显到前端,这个时候就只能用一些别的方法进行判断或者尝试,这个判断或者尝试就叫做盲注.盲注又分为:1.基于布尔SQL ...
- XSS挑战20关
第一关: 没有过滤,直接构造payload过关: http://127.0.0.1/xssgame/level1.php?name=test%3Cscript%3Ealert%28111%29%3C/ ...