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

前言 - 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,已经准备可直接跳过。

bash 复制代码
/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...

bash 复制代码
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

找到下面的内容

ini 复制代码
compile-ffmpeg.sh FF_ALL_ARCHS_IOS8_SDK="armv7 arm64 i386 x86_64"

更改为

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

找到下面的内容

ini 复制代码
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

更改为

ini 复制代码
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 重新执行清理命令
bash 复制代码
./compile-ffmpeg.sh clean

4、开始安装 ffmpeg

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

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

python 复制代码
./compile-ffmpeg.sh all

5、生成Framework

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

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

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

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

5.3 查找轨迹如图所示:
5.4 合成framework
sql 复制代码
lipo -create Release-iphoneos/IJKMediaFramework.framework/IJKMediaFramework Release-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework -output IJKMediaFramework
5.5 合并后的IJKMediaFramework把原来的IJKMediaFramework替换掉

6.添加必要的依赖库

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

AudioToolbox.framework AVFoundation.framework CoreGraphics.framework
CoreMedia.framework CoreVideo.framework libbz2.tbd
libz.tbd MediaPlayer.framework MobileCoreServices.framework
OpenGLES.framework QuartzCore.framework UIKit.framework
VideoToolbox.framework libc++.tbd

7、设置模拟器运行类型

8、示例代码

swift 复制代码
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、效果图

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

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

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

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

github.com/ioswei/Swif...

相关推荐
音视频牛哥13 小时前
从 H.264/H.265 到 H.266:RTSP播放器的跨代际演进
音视频开发·视频编码·直播
OperateCode3 天前
AutoVideoMerge:让二刷更沉浸的自动化视频处理脚本工具
python·opencv·ffmpeg
胡耀超3 天前
DataOceanAI Dolphin(ffmpeg音频转化教程) 多语言(中国方言)语音识别系统部署与应用指南
python·深度学习·ffmpeg·音视频·语音识别·多模态·asr
byxdaz3 天前
FFmpeg QoS 处理
ffmpeg
codelancera5 天前
ffmpeg-调整视频分辨率
ffmpeg·音视频
chenchao_shenzhen6 天前
RK3568嵌入式音视频硬件编解码4K 60帧 rkmpp FFmpeg7.1 音视频开发
ffmpeg·音视频·rk3588·音视频开发·嵌入式开发·瑞芯微rk3568·硬件编解码
_多拉不懂A梦6 天前
FFmepg源码系列-avformat_open_input()
c++·ffmpeg·音视频
音视频牛哥10 天前
跨平台轻量级RTSP服务模块技术详解与内网低延迟直播实践
音视频开发·视频编码·直播
阿飞__10 天前
C++使用FFmpeg进行视频推流
c++·ffmpeg·音视频