快手 · 移动端音视频开发实战
展晓凯
快手回森技术负责人
12246 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 25 讲
快手 · 移动端音视频开发实战
15
15
1.0x
00:00/00:00
登录|注册

14 | iOS平台如何采集视频画面?

你好,我是展晓凯。今天我们一起来学习 iOS 平台的视频画面采集。
前面我们学习的音频采集与编码的方法,可以用来实现音频录制器的功能。但如果要完成视频录制器的功能我们还需要掌握视频采集与编码方面的内容,所以从今天开始我们来学习如何采集视频的画面。
采集到视频画面之后一般会给用户预览出来,这就要结合之前我们学过的视频画面渲染方面的知识,再加上视频的编码,这样就可以在用户点击录制的时候给视频画面编码并且存储到本地了。这节课我们就先来一起学习在 iOS 平台如何采集视频画面。

视频框架 ELImage 架构设计

在 iOS 平台使用 Camera 来采集视频画面的 API 接口比较简单,但要设计出一个优秀的、可扩展的架构,也不是一件容易的事情。所以这节课我会带你设计并实现出一个架构,这个架构基于摄像头采集驱动,中间可以支持视频特效处理,最终用 OpenGL ES 渲染到 UIView 上,且支持扩展插入编码节点。我们先来看一下整体的架构图。
架构图
左边第一个节点是用系统提供的 Camera 接口,采集出一帧内存中的图像,然后将这个图像上传到显存中成为 YUV 的纹理对象,最后将这个 YUV 格式的纹理重新渲染到一个 RGBA 的纹理上。接着将这个 RGBA 类型的纹理对象传到中间的 Filters 节点,这个节点内部会使用 OpenGL ES 来处理这个纹理对象,最后输出一个纹理对象到下面的节点。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

iOS平台视频录制器功能的实现涉及到关键步骤和技术架构设计,本文深入介绍了这些内容。重点讲解了视频画面采集的方法,以及介绍了视频框架ELImage的架构设计,包括摄像头采集驱动、视频特效处理、OpenGL ES渲染等内容。作者详细讲解了摄像头采集数据处理的实现过程,包括摄像头采集数据的处理流程和OpenGL ES渲染操作。此外,还强调了在iOS平台实现视频录制器功能时需要注意的细节,如摄像头配置、像素格式和分辨率设置等。文章内容涵盖了视频录制器功能的实现细节,对于iOS开发者和对视频录制器功能感兴趣的读者来说,具有很高的参考价值。文章通过对iOS平台视频画面采集的关键概念和架构设计进行详细讲解,为读者提供了快速了解和深入学习的基础。文章还提到了ELImage框架的扩展潜力,比如设计ELImageMovie节点,并与ELImageFilter以及ELImageView组合成视频编辑器。这篇文章对于想要深入了解iOS平台视频录制器功能实现的读者来说,是一篇技术含量很高的文章。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《快手 · 移动端音视频开发实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • keepgoing
    老师有三个问题想请教一下: 1. 通过这个采集渲染框架,能否理解为摄像头采集->编辑->渲染的过程就是从摄像头中拿到原始图像,然后经过每一个节点不断渲染到显存中的一个纹理ID上,最终在显示节点上把每一层渲染好的纹理显示到目标view上? 2. 如果需要编码这个最终的图像,是需要编码节点每一帧都从显存中获取吗? 3. 老师在文中提到了每次将内存图片上传显存是一个很低效的做法,可以使用CVOpenGLESTextureCacheCreateTextureFromImage API,请问这个API的原理是什么呢,是怎么做到高效内存->显存的操作呢 感谢老师的解答,辛苦了

    作者回复: 1 理解准确; 2 对的,编码节点将每一帧从显存中获取到YUV数据,在进行编码操作;但是iOS使用CoreVideoFramework有快速的操作,具体看源码 3 底层原理不是特别清楚,我理解的是iOS本身做了映射,毕竟手机中的显存都是内存的一部分;

    2022-12-19归属地:北京
    2
  • 一个正直的小龙猫
    请教老师一个问题: 这个是摄像头采集视频画面,如果是webrtc直播视频流呢? 想录制视频,采集直播流的视频和音频,用什么技术方案实现是最佳的?replaykit2还是ffmepg,他俩对比优缺点是什么?

    作者回复: 无论是什么协议形式的视频直播,采集画面都是第一步,都离不开各自平台摄像头采集API的调用。 replayKit只是录屏的一种手段,他最终也是产生CMSampleBuffer,ffmpeg更多的用在编解码(muxer/demuxer protocol)层,这俩是属于一个系统中不同层的技术实现手段。在详细一点说,replaykit你可以理解为是代替了摄像头和录音器,但是采集到裸数据(YUV、PCM)之后还是需要ffmpeg的软件编码或者平台的硬件编码器来编码成为最终的视频文件或者推流出去的。

    2022-08-24归属地:北京
    2
  • Neil43
    老师你好,我在使用AVFoundation框架的AVAssetWriterinput ,追加SampleBuffer报错,关键代码: AVAsset WriterInput *videoInput = [AVAsset WriterInput asset WriterInput WithMediaType:AVMediaTypeVideo outputSettings:videoSettings]; assetWriter = [[AVAssetWriter alloc] initWithURL: _URL fileType:AVFileTypeQuickTimeMovie error: &error]; [assetWriter addInput:_videolnput]; BOOL success = [videoInput appendSampleBuffer:sampleBuffer]; 具体报错信息: userInfo={ NSLocalizedFailureReason = An unknown error occurred (-12780), NSLocalizedDescription = The operation could not be completed, NSUnderlyingError = Error Domain=NSOSStatusErrorDomain Code=-12780 "(null)”} 请问老师知道大概是什么原因吗?如果appendSampleBuffer方法报错,再调用finishWritingWithCompletionHandler方法,能正常生成视频吗?谢谢。

    作者回复: 不能正常生成的。 你可以检查一下状态,AVAssetWriter的状态,如果他的状态不是“可写入”状态就不能去appendBuffer,而是看看状态为什么错误,比如文件路径之类的问题。

    2022-08-24归属地:北京
  • peter
    请教老师一个问题: Q1:AI唱歌,有能够使用的软件吗?(开源、付费的都可以)。 AI唱歌,是指用一个人的声音把一首歌完整的唱出来。比如有特朗普的一段音频(比如30s声音片段),然后软件根据这个声音片段,就可以把《好汉歌》唱出来。效果就是听众认为是特朗普唱的《好汉歌》。

    作者回复: 你说的应该是歌声合成,现在业界内有几种实现方式,可以参考https://github.com/oxygen-dioxide/vogen,但是效果都不是特别好,要么机械声过于严重,要么不像,之前阿里有一个产品叫鲸鸣做过这种类型的修音,起码在直接toC的产品上没有那么大的爆发力,和当时的ZAO这种利用DeepFake的视觉生成给用户的感染力不一样。

    2022-08-24归属地:北京
  • 月半木子🎊
    请问老师,这个实现如何自测是否满足需求呢,自测需要关注哪些测试点呢
    2023-06-13归属地:福建
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部