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) { ...
随机推荐
- jvm源码解读--03 常量池的解析ConstantPool
先看bt栈 (gdb) bt #0 ConstantPool::allocate (loader_data=0x7fe21802e868, length=87, __the_thread__=0x7f ...
- jquery.autocomplete 使用解析
页面引用 <script type="text/javascript" src="${base}/autocom/jquery-1.8.2.min.js" ...
- python自动化之(自动生成测试报告)
前言: 用python执行测试脚本, 测试报告是记录我们测试过程的问题, 方便我们对整个测试过程的把控. 这里引用的是别人写好的模板, 我们拿过来用就OK, 能力强者可自行编写模板 测试报告图模板: ...
- 守护线程_daemon
守护线程_daemon 线程分为用户线程和守护线程 虚拟机必须确保用户线程(main)执行完毕 虚拟机不用等待守护线程(gc)执行完毕 如:后台记录操作日志,监控内存,垃圾回收等等 测试案例: pac ...
- SSRF详解
上一篇说了XSS的防御与绕过的思路,这次来谈一下SSRF的防御,绕过,利用及危害 0x01 前置知识梳理 前置知识涉及理解此漏洞的方方面面,所以这部分要说的内容比较多 SSRF(Server-Side ...
- Longhorn,企业级云原生容器分布式存储 - 备份与恢复
内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 企业级云原生容器分布式存储解决方案设计架构和概念 Longhorn 企业级云原生容器分 ...
- flutter中将widget转为base64
flutter中可以通过RepaintBoundary widget中的toImage方法将页面中的widget转为base64. 如何使用? 首先要在全局定义一个global key,分配给Repa ...
- springboot 和spring cloud 博客分享
spring boot 知识点总结 天狼星 https://www.cnblogs.com/wjqhuaxia/p/9820902.html spring cloud 知识点总结 姿势帝 https: ...
- COM笔记-Widows 注册表
Widows 注册表 HKEY_CLASSES_ROOT在此关键字之下,可以看到有一个CLSID关键字.在CLSID关键字之下列有系统中安装的所有组件的CLSID.注册表CLSID是一个具有如下格式的 ...
- Qt多窗口编程详解
常用的窗体基类是 QWidget.QDialog 和 QMainWindow,在创建 GUI 应用程序时选择窗体基类就是从这 3 个类中选择. QWidget 直接继承于 QObject,是 QDia ...