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...

相关推荐
不太会编程的IT男15 小时前
在 Jetson Orin 开发套件上使用 Hardware Encoder / Decoder 构建 FFmpeg
ffmpeg·视频编解码·h.264
m0_6873998416 小时前
写一个Ununtu C++ 程序,调用ffmpeg API, 来判断一个数字电影的视频文件mxf 是不是Jpeg2000?
开发语言·c++·ffmpeg
aqi0018 小时前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体
Java患者·1 天前
【小白】linux安装ffmpeg | java转码 【超详细】
ffmpeg
suifen_1 天前
RK平台ffmpeg支持硬件编解码
ffmpeg
feiyangqingyun1 天前
全网唯一/Qt结合ffmpeg实现手机端采集摄像头推流到rtsp或rtmp/可切换前置后置摄像头/指定分辨率帧率
qt·智能手机·ffmpeg
melonbo1 天前
使用FFmpeg将H.264码流封装为MP4
ffmpeg·音视频·h.264
aqi001 天前
FFmpeg开发笔记(七十七)Android的开源音视频剪辑框架RxFFmpeg
android·ffmpeg·音视频·流媒体
慢行的骑兵1 天前
Android音视频探索之旅 | CMake基础语法 && 创建支持Ffmpeg的Android项目
ffmpeg·音视频
Little_Code2 天前
uniapp 使用ffmpeg播放rtsp
ffmpeg·uni-app·rtsp