SwiftUI-接入Bilibili直播拉流SDK【最新保姆级教程】

4,573 阅读2分钟

前言 - ijkplayer有多强大?

1、ijkplayer是一个适用于Android和iOS平台的、基于FFmpeg的轻量级视频播放器。它支持大多数视频和流协议,包括HTTP、RTMP、HLS、RTSP、MMS等,并且能够处理MKV、AVI、MP4、WMV、FLV等各种格式的文件。

2、Ijkplayer是一个完全开源、快速、轻量级的媒体播放器项目,基于原生FFmpeg。它是Bilibili工程师根据Bilibili解决方案开发的,并开源了它的Android和iOS版本。Ijkplayer带有许多不同的选项,可帮助您自定义播放器以满足您的需求。

3、Ijkplayer允许您在应用程序中的任何地方嵌入视频播放器,包括列表视图和详细视图。

前置准备

1、需要Mac上已经安装Homebrew、Git、yasm,已经准备可直接跳过。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install git 
brew install yasm

2、下载ijkplayer

找一个方便查看的目录,创建一个任意名字的文件。通过 git clone 拉取代码。 [Github地址]github.com/Bilibili/ij…

git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios
cd ijkplayer-ios
git checkout -B latest k0.8.8

3、修改脚本文件,由于B站的SDK许久未更新。导致被苹果霸霸废弃的架构依旧存在,无法顺利下载ffmpeg库。 即编译armv7库失败

3.1 修改 compile-ffmpeg.sh

找到下面的内容 image.png

compile-ffmpeg.sh FF_ALL_ARCHS_IOS8_SDK="armv7 arm64 i386 x86_64"

更改为

FF_ALL_ARCHS_IOS8_SDK="arm64 i386 x86_64"
3.2 前往tools文件,修改 do-compile-ffmpeg.sh

找到下面的内容

image.png

elif [ "$FF_ARCH" = "armv7" ]; then
    FF_BUILD_NAME="ffmpeg-armv7"
    FF_BUILD_NAME_OPENSSL=openssl-armv7
    FF_XCRUN_OSVERSION="-miphoneos-version-min=6.0"
    FF_XCODE_BITCODE="-fembed-bitcode"
    FFMPEG_CFG_FLAGS="$FFMPEG_CFG_FLAGS $FFMPEG_CFG_FLAGS_ARM"
#    FFMPEG_CFG_CPU="--cpu=cortex-a8"
elif [ "$FF_ARCH" = "armv7s" ]; then

更改为

elif [ "$FF_ARCH" = "armv7" ]; then
    FF_BUILD_NAME="ffmpeg-armv7"
    FF_BUILD_NAME_OPENSSL=openssl-armv7
    FF_XCRUN_OSVERSION="-miphoneos-version-min=6.0"
    FF_XCODE_BITCODE="-fembed-bitcode"
#    FFMPEG_CFG_FLAGS="$FFMPEG_CFG_FLAGS $FFMPEG_CFG_FLAGS_ARM"
    FFMPEG_CFG_FLAGS="$FFMPEG_CFG_FLAGS --enable-pic --disable-asm"
#    FFMPEG_CFG_CPU="--cpu=cortex-a8"
elif [ "$FF_ARCH" = "armv7s" ]; then
3.3 重新执行清理命令
./compile-ffmpeg.sh clean

4、开始安装 ffmpeg

回到ijkplayer-ios路径下执行命令。

如果出现Error,证明安装失败,请检查第三步的修改是否存在问题?是否开启了代理或者VPN? 注:下载过程有些缓慢和卡顿请有耐心等待。

./compile-ffmpeg.sh all

5、生成Framework

5.1 打开ijkplayer-ios/ios/IJKMediaPlayer目录下的IJKMediaPlayer.xcodeproj

选择IJKMediaFramework,将Scheme的Build方式改为Release后,分别将设备选为模拟器和真机各编译一次。

image.png

5.2 点击 File -> Product Setting。前往编译生成的模拟器和真机的framework。

注:如果DerivedData目录中的文件过度,请全部删除后。重新生成framework文件,方便查找。

image.png

5.3 查找轨迹如图所示:

image.png

5.4 合成framework
lipo -create Release-iphoneos/IJKMediaFramework.framework/IJKMediaFramework Release-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework -output IJKMediaFramework
5.5 合并后的IJKMediaFramework把原来的IJKMediaFramework替换掉

e00d54be3245030e87e4a9aab4ebd4a8.png

6.添加必要的依赖库

IJKMediaFramework.framework拖拽到你的工程,并添加以下依赖库

AudioToolbox.frameworkAVFoundation.frameworkCoreGraphics.framework
CoreMedia.frameworkCoreVideo.frameworklibbz2.tbd
libz.tbdMediaPlayer.frameworkMobileCoreServices.framework
OpenGLES.frameworkQuartzCore.frameworkUIKit.framework
VideoToolbox.frameworklibc++.tbd

7、设置模拟器运行类型

image.png

8、示例代码

import SwiftUI
import IJKMediaFramework

struct PlayLiveView: UIViewRepresentable {
    func makeUIView(context: Context) -> UIView {
        return PlayerView(frame: CGRect(x: 0 , y: 50, width: 200, height: 200))
    }
    
    func updateUIView(_ uiView: UIView, context: Context) {
        
    }
}

class PlayerView: UIView {
    
    var player: IJKFFMoviePlayerController?
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        let options = IJKFFOptions.byDefault()
        let url = URL(string: "rtmp://mobliestream.c3tv.com:554/live/goodtv.sdp")
        player = IJKFFMoviePlayerController(contentURL: url, with: options)
        player?.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        player?.view.frame = frame
        player?.scalingMode = .aspectFill
        player?.shouldAutoplay = true
        self.autoresizesSubviews = true
        self.addSubview(player!.view)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func didMoveToSuperview() {
        super.didMoveToSuperview()
        
        if self.superview == nil {
            player?.shutdown()
        } else {
            player?.prepareToPlay()
        }
    }
}

struct ContentView: View {
    @State private var emailAddress: String = ""
    @State private var isSecure: Bool = false
    var body: some View {
        VStack {
            PlayLiveView().padding(20)
        }
    }
}

9、效果图

image.png

10、Github 地址,可以直接使用已经生成好的 framework,纵享丝滑~

因Github上传文件限制,请移步百度网盘下载

LiveSDK链接: pan.baidu.com/s/1bV62mkSK… 提取码: 9agy

喜欢就点个Star,Thanks♪(・ω・)ノ

github.com/ioswei/Swif…