当前位置:首页 > 数码 >

苹果设备直播教程(苹果直播最佳设置)

来源:原点资讯(www.yd166.com)时间:2023-04-21 13:55:42作者:YD166手机阅读>>

iOS 直播流程概述

苹果设备直播教程,苹果直播最佳设置(1)

写在前面

本文目的在于带大家了解一场直播背后,需要经历哪些阶段,以及每个阶段都做了哪些工作,才能够把主播的声音画面送到观众的面前。我们把直播的流程划分为以下六个阶段:

  1. 采集
  2. 处理
  3. 编码
  4. 封装
  5. 网络传输
  6. 播放

下面来一一介绍。

采集

采集又分为视频采集、音频采集。

一般来说,我们会借助系统 api 来实现这一部分的工作。以 iOS 为例,需要用到 AVFoundation 框架来获取手机摄像头拍到的视频数据,或者使用 ReplayKit 录制屏幕,以及麦克风收集到的音频数据。

视频采集:摄像头核心类 AVCaptureXXX

使用摄像头采集视频的几个核心类如下图所示:

苹果设备直播教程,苹果直播最佳设置(2)

具体代码如下:

// 1. 创建一个 session var session = AVCaptureSession.init() // 2. 获取硬件设备:摄像头 guard let device = AVCaptureDevice.default(for: .video) else { print("获取后置摄像头失败") return } // 3. 创建 input let input = try AVCaptureDeviceInput.init(device: device) if session.canAddInput(input) { session.addInput(input) } // 4. 创建 output let videoOutput = AVCaptureVideoDataOutput.init() let pixelBufferFormat = kCVPixelBufferPixelFormatTypeKey as String // 设置 yuv 视频格式 videoOutput.videoSettings = [pixelBufferFormat: kCVPixelFormatType_420YpCbCr8BiPlanarFullRange] videoOutput.setSampleBufferDelegate(self, queue: outputQueue) if session.canAddOutput(videoOutput) { session.addOutput(videoOutput) } // 5. 设置预览 layer:AVCaptureVideoPreviewLayer let previewViewLayer = videoConfig.previewView.layer previewViewLayer.backgroundColor = UIColor.black.cgColor let layerFrame = previewViewLayer.bounds let videoPreviewLayer = AVCaptureVideoPreviewLayer.init(session: session) videoPreviewLayer.frame = layerFrame videoConfig.previewView.layer.insertSublayer(videoPreviewLayer, at: 0) // 6. 在 output 回调里处理视频帧:AVCaptureVideoDataOutputSampleBufferDelegate func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { // todo: sampleBuffer 视频帧 } 色彩二次抽样:YUV

一般来说,我们看到的媒体内容,都经过了一定程度的压缩。包括直接从 iPhone 摄像头采集的图像数据,也会经过色彩二次抽样这一压缩过程。

在上一步中创建 output 的时候,我们设置了视频的输出格式是kCVPixelFormatType_420YpCbCr8BiPlanarFullRange 的。在这句代码中,我们需要注意到两个地方:420和YpCbCr。

  • YpCbCr:代表 YUV(Y-Prime-C-B-C-R) 格式。
    • Y 指的是亮度信息
    • UV 是色彩信息。

人眼对亮点信息更敏感,单靠 Y 数据,可以完美呈现黑白图像;也就是说可以压缩 UV 信息,而人眼难以发现。

下右图:单靠黑白亮度信息,已经足以描述整个照片的纹理。加上 uv 色彩信息后,就成了下左图的彩色图片的效果。

  • 420:代表的是设备取样时色彩二次抽样的参数

4:2:0 中,第一个数,代表几个关联的色块(一般是4);第二个数,代表第一行中包含色彩 uv 信息的像素个数;第三个数,代表第二行中包含色彩 uv 信息的像素个数。(每个像素里都包含亮度信息 Y)

取样的时候,一些专业的相机会以 4:4:4 的参数捕捉图像,面向消费者的 iPhone 相机,通常用 4:2:0 的参数,也能拍出来高质量的视频或图片。!

视频采集:录屏

录屏又分为两种:

  • 应用内采集:只能采集当前 app 的屏幕内容
  • 应用外采集:可以采集这个手机屏幕的内容,包括退后台之后,整个手机界面的录制。一般用来做游戏直播、会议 app 分享屏幕功能。
1. 应用内采集

// iOS 录屏使用的框架是 ReplayKit import ReplayKit // 开始录屏 RPScreenRecorder.shared().startCapture { sampleBuffer, bufferType, err in } completionHandler: { err in } // 结束录屏 RPScreenRecorder.shared().stopCapture { err in }

针对应用内录屏,有以下两个 Tip:

  • 不想要被录制进去的 UI ,可以放到自定义 UIWindow 上
  • 录屏同时开启前置摄像头,可以获取 RPScreenRecorder.shared().cameraPreviewView ,并将其添加到当前视图上。
2. 应用外采集

应用外采集需要创建一个 broadcast upload extension,创建完成后会生成一个 SampleHander 类,在这个类里面可以获取到采集的视频数据。

苹果设备直播教程,苹果直播最佳设置(3)

class SampleHandler: RPBroadcastSampleHandler { func sohuSportUserDefaults() -> UserDefaults? { return UserDefaults.init(suiteName: "com.xxx.xx") } override func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) { // 开始录屏,setupInfo 是从 UI extension 传递过来的参数 } override func broadcastPaused() { // 暂停录屏 } override func broadcastResumed() { // 继续录屏 } override func broadcastFinished() { // 录屏结束 } // 录屏回调 override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) { // sampleBuffer switch sampleBufferType { case .video: // 视频 case .audioApp: // 应用内声音 case .audioMic: // 麦克风声音 } } }

extension 进程和主 app 进程间通信,可以通过以下几种方式:

  • App Group:User Default
  • 使用 socket 往 host app 传输数据
  • CFNotification
音频采集:Audio Unit

iOS 直播中的音频采集,我们一般会用到 Audio Unit 这一底层框架,这一框架允许我们在采集的时候对录制的音频进行一些参数设置,以便获取到最高质量与最低延迟的音频。核心代码如下:

// 创建 audio unit self.component = AudioComponentFindNext(NULL, &acd); OSStatus status = AudioComponentInstanceNew(self.component, &_audio_unit); if (status != noErr) { [self handleAudiounitCreateFail]; } // asbd AudioStreamBasicDescription desc = {0}; desc.mSampleRate = 44100; // 采样率 desc.mFormatID = kAudioFormatLinearPCM; // 格式 desc.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked; desc.mChannelsPerFrame = 1; // 声道数量 desc.mFramesPerPacket = 1; // 每个包中有多少帧, 对于PCM数据而言,因为其未压缩,所以每个包中仅有1帧数据 desc.mBitsPerChannel = 16; desc.mBytesPerFrame = desc.mBitsPerChannel / 8 * desc.mChannelsPerFrame; desc.mBytesPerPacket = desc.mBytesPerFrame * desc.mFramesPerPacket; // 回调函数 AURendercallbackStruct callback; callback.inputProcRefCon = (__bridge void *)(self); callback.inputProc = handleVideoInputBuffer; // 设置属性 AudioUnitSetProperty(self.audio_unit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &desc, sizeof((desc))); AudioUnitSetProperty(self.audio_unit, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 1, &callback, sizeof((callback))); UInt32 flagOne = 1; AudioUnitSetProperty(self.audio_unit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &flagOne, sizeof(flagOne)); // 配置 AVAudioSession AVAudioSession *session = [AVAudioSession sharedInstance]; [session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers error:nil]; [session setActive:YES withOptions:kAudioSessionSetActiveFlag_NotifyOthersOnDeactivation error:nil]; [session setActive:YES error:nil]; #pragma mark - 音频回调函数 static OSStatus handleVideoInputBuffer(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) { // } 处理

对视频来说,这一阶段的主要工作是拿到 SampleBuffer,做一下美白、磨皮、滤镜等效果。本质上来说,这些操作都是在修改每一帧像素点的坐标和颜色变化,流程如下:

苹果设备直播教程,苹果直播最佳设置(4)

首页 123下一页

栏目热文

苹果手机直播设置教程(苹果手机开通直播操作方法)

苹果手机直播设置教程(苹果手机开通直播操作方法)

《王者荣耀》怎么投屏到电脑上直播?《王者荣耀》直播如何设置?今天给大家分享一下怎么在电脑上直播《王者荣耀》,教你把游戏画...

2023-04-21 14:10:44查看全文 >>

爱人的谎言向阳大结局(爱人的谎言中向阳什么结局)

爱人的谎言向阳大结局(爱人的谎言中向阳什么结局)

《爱人的谎言》最新剧情看点十足,易奕向四季表白的情节也让网友大呼期待。那么《爱人的谎言》哪一集易奕和四季表白在一起?易奕...

2023-04-21 14:12:35查看全文 >>

爱人的谎言夏琳和向阳在雨中(爱人的谎言大结局夏玲见到向阳)

爱人的谎言夏琳和向阳在雨中(爱人的谎言大结局夏玲见到向阳)

点击标题下「浙江卫视中国蓝」可快速关注近日,由贾青、张晓龙、邱胜翊主演的都市情感大戏《爱人的谎言》继续在浙江卫视上演着虐...

2023-04-21 14:10:26查看全文 >>

爱人的谎言大结局夏琳向阳(爱人的谎言大结局孩子出生)

爱人的谎言大结局夏琳向阳(爱人的谎言大结局孩子出生)

目前,都市情感大戏《爱人的谎言》在浙江卫视中国蓝剧场持续热播,随着剧情的发展,邱胜翊所饰演的骑士向阳与青梅竹马童四季、霸...

2023-04-21 14:04:14查看全文 >>

爱人的谎言夏琳和向阳在一起(爱人的谎言四季和向阳吻戏)

爱人的谎言夏琳和向阳在一起(爱人的谎言四季和向阳吻戏)

爱人的谎言第7集剧情介绍向阳四季重逢 易奕成夏琳目标天生丽质的夏琳非常擅长于运用自己的魅力,上流世界的优质男经常是她狩猎...

2023-04-21 14:03:58查看全文 >>

苹果手机直播需要什么(苹果手机最好直播方法)

苹果手机直播需要什么(苹果手机最好直播方法)

做一场直播之前的 三要:计:做计划。做好各种计划把握好时间节点 练:要演练。多多排练 不紧张保证不出错 盘:要复盘,总结...

2023-04-21 13:36:49查看全文 >>

苹果手机直播间设置教程(苹果手机直播地址怎么改)

苹果手机直播间设置教程(苹果手机直播地址怎么改)

想做虚拟直播间!跟我这样做!只需要一个手机软件就能搞定!现在开直播已经不是什么新鲜事了,但是新手想要搭建一个虚拟直播间却...

2023-04-21 14:09:57查看全文 >>

苹果手机直播攻略入口(现在苹果手机怎么连接电脑直播)

苹果手机直播攻略入口(现在苹果手机怎么连接电脑直播)

9月13日凌晨1点,科技界春晚苹果新品发布会将再次拉开序幕。去年差不多这个时候,一个被吐槽无数的刘海屏设计已经成为今年新...

2023-04-21 14:19:57查看全文 >>

苹果手机要怎么才能直播(苹果手机最好直播方法)

苹果手机要怎么才能直播(苹果手机最好直播方法)

很多朋友都在问:手机怎么开直播?听说直播行业很赚钱,但是想做却苦于不知道怎么做,没有资源?新公司没有主播资源,没有外站流...

2023-04-21 14:07:53查看全文 >>

苹果手机直播同步(苹果手机如何直播简单教程)

苹果手机直播同步(苹果手机如何直播简单教程)

近期,我们客服人员接到了许多客户都在咨询一个相同的问题:疫情时期,许多主播都被限在自己的城市,无法到直播企业所在地进行直...

2023-04-21 13:59:19查看全文 >>

文档排行