因为公司项目需要,我一个连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视频流的更多相关文章

  1. 使用vlc播放器播放rtsp流视频

    可参考: 使用vlc播放器做rtsp服务器 web网页中使用vlc插件播放相机rtsp流视频 使用vlc进行二次开发做自己的播放器 首先需要安装vlc播放器,下载及安装步骤略 使用vlc播放器播放rt ...

  2. 【转】C# 视频监控系列(12):H264播放器——播放录像文件

    原文地址:http://www.cnblogs.com/over140/archive/2009/03/23/1419643.html?spm=5176.100239.blogcont51182.16 ...

  3. 如何实现Windows平台RTMP播放器/RTSP播放器播放窗口添加OSD文字叠加

    好多开发者在做Windows平台特别是单屏多画面显示时,希望像监控摄像机一样,可以在播放画面添加OSD台标,以实现字符叠加效果,大多开发者可很轻松的实现以上效果,针对此,本文以大牛直播SDK (Git ...

  4. RTSP播放器或RTMP播放器常用的Evnet事件回调设计

    很多开发者在开发RTSP或RTMP播放器的时候,不晓得哪些event回调事件是有意义的,针对此,我们以大牛直播SDK(github)的Android平台RTSP/RTMP直播播放端为例,简单介绍下常用 ...

  5. EasyPlayer-RTSP-Android安卓播放器播放RTSP延迟优化策略,极低延时!

    EasyPlayer-RTSP-Android安卓RTSP播放器低延迟播放延时优化策略 EasyPlayer-RTSP-Android播放器是一款专门针对RTSP协议进行过优化的流媒体播放器,其中我们 ...

  6. .net C# 网页播放器 支持多种格式 媒体播放器 播放器 代码

    .avi格式代码片断如下:<object id='video' width='400' height='200' border='0' classid='clsid:CFCDAA03-8BE4- ...

  7. 第十一篇、HTML5隐藏播放器播放背景音乐

    html5添加网页背景音乐  一个客户要求给网站添加一个背景音乐,我用的是html5添加网页背景音乐的代码,在此记录一下以后有用. html5方法一:<audio autoplay=" ...

  8. flv网页播放器播放失败

    在IIS6.0上发布网站时,在路径正确的情况下,网页flv播放器还是无法播放flv视频的解决方法. 1.打开IIS6.0管理器,打开发布的网站,点击打开属性窗口. 2.在HTTP头选项里找到MIME类 ...

  9. java调用本地播放器播放视频文件。调用本地播放器不能播放指定文件的说明。

    public class OpenExe extends HttpServlet { //打开本地播放器并播放视频 public static void openExe(String file) { ...

随机推荐

  1. jvm源码解读--06 Method 方法解析

    进入 // Methods bool has_final_method = false; AccessFlags promoted_flags; promoted_flags.set_flags(0) ...

  2. jvm源码解读--04 常量池 常量项的解析CONSTANT_Class_info

    接上篇的继续 ConstantPool* constant_pool = ConstantPool::allocate(_loader_data, length, CHECK_(nullHandle) ...

  3. TCP 才不傻!

    大家好,我是小林. 之前收到个读者的问题,对于 TCP 三次握手和四次挥手的一些疑问: 第一次握手,如果客户端发送的SYN一直都传不到被服务器,那么客户端是一直重发SYN到永久吗?客户端停止重发SYN ...

  4. 以TiDB热点问题来谈Region的调度流程

    什么是热点问题 说这个话题之前我们先回顾一下TiDB的主要结构和概念. TiDB的核心架构分为TiDB.TiKV.PD三个部分,其中TiKV是一个分布式数据存储引擎用来存储真实的数据,在TiKV中又对 ...

  5. Openresty Lua协程调度机制

    写在前面 OpenResty(后面简称:OR)是一个基于Nginx和Lua的高性能Web平台,它内部集成大量的Lua API以及第三方模块,可以利用它快速搭建支持高并发.极具动态性和扩展性的Web应用 ...

  6. Create Virtual Network with VirtualBox on Mint 14

    VirtualBox version: VirtualBox-4.2.18-88780-Linux_x86.run Host OS: Linux Mint 14 Xfce Setup Network ...

  7. DFT、DTFT、DFS、FFT之间的关系

    DFT.DTFT.DFS.FFT.FT.FS之间的关系 FT和FS是研究连续信号的,在数字信号处理中不涉及. 主要是前四种的关系: DFT(Discrete Fourier Transform):离散 ...

  8. 带头撸抽奖系统,DDD + RPC 开发分布式架构!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.咋,撸个项目? 总有粉丝伙伴问傅哥,有没有能上手练习技术的项目,现在学了这么多技术知识.看 ...

  9. 题解 Emotional Flutter

    传送门 因为一个等号挂掉了10pts 发现每个黑色段一定对应了一段不可行的出发区间 检查是否存在所有黑色段的并集的补集即可 具体来说,我们对于每个黑色段计算出一个(有的是两个)区间 \([l, r]\ ...

  10. SpringBoot获取请求的参数

    说明 SpringBoot 为我们封装了许多,简便的获取请求参数的方法! 1.获取无注解获取请求参数 请求地址:http://192.168.0.115:8080/myproject/test/noA ...