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包删除之后,终于恢复了正常!

 

版权声明:本文为17years原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/17years/p/15239678.html