Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS端 TRTC v2 版本自定义采集视频数据实现

iOS端 TRTC v2 版本自定义采集视频数据实现

原创
作者头像
腾讯云-chaoli
发布于 2019-07-07 11:37:53
发布于 2019-07-07 11:37:53
2.1K10
代码可运行
举报
运行总次数:0
代码可运行

常见场景

实时音视频 SDK 默认会采集摄像头数据,如果开发者想在 TRTC 中集成使用第三方美颜库来实现美颜滤镜等预处理功能,可以采用自定义采集视频数据接口,然后复用 LiteAVSDK 的编码和推流功能。 目前自定义采集支持的平台包括 iOSAndroid 、Mac OS 、Windows 。接口文档参考:https://cloud.tencent.com/document/product/647/32259#.E8.87.AA.E5.AE.9A.E4.B9.89.E9.87.87.E9.9B.86.E5.92.8C.E6.B8.B2.E6.9F.93

自定义采集视频接口介绍

TRTC SDK 的 iOS 版本支持 NV12 和 i420 两种 YUV 数据格式,在 iOS 平台上,比较高性能的图像传递方式是 CVPixelBufferRef,因此我们建议按如下表格填写参数:

参数填写

参数名称

参数类型

推荐取值

备注说明

pixelFormat

TRTCVideoPixelFormat

TRTCVideoPixelFormat_NV12

iOS 平台上摄像头原生采集出的视频格式即是 NV12。

bufferType

TRTCVideoBufferType

PixelBuffer

iOS中原声支持的视频帧格式,性能最佳。

pixelBuffer

CVPixelBufferRef

如果 TRTCVideoBufferType 是 PixelBuffer 才需填写。

iPhone 摄像头采集的数据是 NV12 格式的 PixelBuffer。

data

NSData*

如果 TRTCVideoBufferType 是 NSData 才需填写。

性能不如 PixelBuffer

timestamp

uint64_t

0

可以填0,这样 SDK 会自定填充 timestamp 字段,但请“均匀”地控制 sendCustomVideoData 的调用间隔。

width

uint64_t

视频画面的宽度

请严格填写传入画面的像素宽度

height

uint32_t

视频画面的高度

请严格填写传入画面的像素高度

rotation

TRTCVideoRotation

不填写

该字段用于自定义渲染,此处无需设置。

示例代码

在 Demo 文件夹中,您会找到一个叫做 TestSendCustomVideoData.m 的文件,它展示了如何从一个本地视频文件中读取出 NV12 格式的 PixelBuffer,并送给 SDK 进行后续处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//组装一个 TRTCVideoFrame 并将其送给 trtcCloud 对象
TRTCVideoFrame* videoFrame = [TRTCVideoFrame new];
videoFrame.bufferType = TRTCVideoBufferType_PixelBuffer;
videoFrame.pixelFormat = TRTCVideoPixelFormat_NV12;
videoFrame.pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

[trtcCloud sendCustomVideoData:videoFrame];

实现步骤

实现自定义采集视频只需要在进房前启用视频自定义采集模式,enableCustomVideoCapture设置为YES。然后将采集到的 yuv 数据通过 sendCustomVideoData 接口不断的回调给SDK,SDK收到数据后会自行编码并进行网络传输。

  • 启用视频自定义采集模式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 启用视频自定义采集模式
[_trtc enableCustomVideoCapture:YES];

// 打开 SDK 音频采集(自定义采集场景下不需要打开 SDK 本地预览)
// [_trtc startLocalPreview:YES view:_localView];
[_trtc startLocalAudio];

// 进房
TRTCAppScene scene = [TRTCSettingViewController getAppScene];
[_trtc enterRoom:self.param appScene:scene];
  • 将视频数据传给SDK
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma mark - AVCaptureVideoDataAndAudioDataOutputSampleBufferDelegate
//以系统API调用 AVCaptureSession 采集 NV12 格式数据为例
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {

    TRTCVideoFrame* videoFrame = [TRTCVideoFrame new];
    videoFrame.bufferType = TRTCVideoBufferType_PixelBuffer;
    videoFrame.pixelFormat = TRTCVideoPixelFormat_NV12;
    videoFrame.pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    [_trtc sendCustomVideoData:videoFrame];

}
  • iOS 6.3及之后版本支持 NV12 和 i420 两种 YUV 数据格式(6.2版本只支持 i420),如果需要转换 yuv 格式可以通过三方库 libyuv 实现
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//通过 libyuv 转换 yuv 格式
- (void)nv12ToI420:(CVPixelBufferRef)src dest:(CVPixelBufferRef)dst {

    //图像宽度(像素)
    int pixelWidth = (int)CVPixelBufferGetWidth(src);
    //图像高度(像素)
    int pixelHeight = (int)CVPixelBufferGetHeight(src);

    uint8_t *src_y = NULL;
    uint8_t *src_uv = NULL;
    uint8_t *dst_y = NULL;
    uint8_t *dst_u = NULL;
    uint8_t *dst_v = NULL;
    CVPixelBufferLockBaseAddress(src, 0);
    src_y = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane(src, 0);
    src_uv = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane(src, 1);
    int src_ystride = (int)CVPixelBufferGetBytesPerRowOfPlane(src, 0);
    int src_uvstride = (int)CVPixelBufferGetBytesPerRowOfPlane(src, 1);
    CVPixelBufferLockBaseAddress(dst, 0);
    dst_y = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane(dst, 0);
    dst_u = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane(dst, 1);
    dst_v = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane(dst, 2);
    int dst_ystride = (int)CVPixelBufferGetBytesPerRowOfPlane(dst, 0);
    int dst_ustride = (int)CVPixelBufferGetBytesPerRowOfPlane(dst, 1);
    int dst_vstride = (int)CVPixelBufferGetBytesPerRowOfPlane(dst, 2);

    NV12ToI420(src_y, src_ystride, src_uv, src_uvstride, dst_y, dst_ystride, dst_u, dst_ustride, dst_v, dst_vstride, pixelWidth, pixelHeight);

    CVPixelBufferUnlockBaseAddress(src, 0);
    CVPixelBufferUnlockBaseAddress(dst, 0);
}

常见问题

1、调用 sendCustomVideoData 接口报错下图错误什么原因?

这个报错的原因是调用 sendCustomVideoData 传参 TRTCVideoFrame 的数据类型不正确导致的,比如设置的 TRTCVideoPixelFormat_I420 类型,但是传给 SDK 的数据类型是 NSData 或者其它就有可能报这个错误。

2、调用 sendCustomVideoData 接口报错提示提示drop one frame by sending frequency too fast! 是什么原因? 这个提示不是报错而是一个警告,原因是调用 sendCustomVideoData 频率过快,需要确保发送频率和 SDK 里面设置的 TRTCVideoEncParam 帧率保持一致。

3、播放自定义采集的画面出现花屏或者视频画面颜色异常情况? 这种一般是传给 SDK 的 yuv 格式数据异常导致的,大家都知道y分量表示亮度,u、v 分量表示颜色,如果u、v 分量获取的不正确就会导致画面颜色异常。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
您好,我设置 bufferType 为 TRTCVideoBufferType_NSData 时,传入的data无法被解析。提示 [E][TRTCCloud.mm, sendCustomVideoData, 6506]:input video pixel format error!! 0. Only NV12 I420 32BGRA format is supported。我的data数据由 CMSampleBufferRef 转换来的。请问以什么转换方式来进行data才能被解析呢,我找了好久没看到有相关的说明。
您好,我设置 bufferType 为 TRTCVideoBufferType_NSData 时,传入的data无法被解析。提示 [E][TRTCCloud.mm, sendCustomVideoData, 6506]:input video pixel format error!! 0. Only NV12 I420 32BGRA format is supported。我的data数据由 CMSampleBufferRef 转换来的。请问以什么转换方式来进行data才能被解析呢,我找了好久没看到有相关的说明。
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
iOS 不用 libyuv 也能高效实现 RGB/YUV 数据转换丨音视频工业实战
做音视频或图像处理方向的开发同学一般都或多或少接触过 libyuv[1] 这个开源库,我们在音视频开发中处理 YUV、RGB 等格式的数据转换、旋转、缩放时常常用到它。libyuv 基于 C 语言实现,可以在 Windows、Linux、Mac OS、Android、iOS 等多平台使用,并且做了指令集加速优化,有比较好的性能表现。
关键帧
2023/11/09
8830
iOS 不用 libyuv 也能高效实现 RGB/YUV 数据转换丨音视频工业实战
iOS移动直播,自定义采集视频数据推流
当音视频采集和预处理(即美颜、滤镜这些)开发者已经全部实现,只需要使用 SDK 来编码和推流,那么可以通过 TXLiteAVSDK 提供的自定义采集数据接口来满足该场景。
腾讯云-chaoli
2019/03/14
3.3K0
iOS移动直播,自定义采集视频数据推流
小型电裁剪刀_手动裁剪
由于简书经常打不开,或者打开慢,不靠谱,还是把文章迁移到CSDN吧。 简书链接:https://www.jianshu.com/p/8c6508cab763 有时候想对摄像头采集的视频流进行区域裁剪,可以使用libyuv这个库,原理就是先把NV12转换为i420,对i420做裁剪,然后再把i420转换为NV12,NV12再转换为CVPixelBufferRef,CVPixelBufferRef再转换为CMSampleBufferRef。
全栈程序员站长
2022/11/08
1.6K0
Android TRTC 推自定义采集的视频数据
如果开发者想在 TRTC 中集成第三方美颜库来实现美颜、滤镜等功能,第三方库的美颜功能输入数据格式支持有 camera 的原始数据(YUV 数据)、纹理数据(Textureid)。开发者想实现该功能,需要采用自定义采集视频数据接口,然后复用 LiteAVSDK 的编码和推流功能。
腾讯云-chaoli
2019/07/07
1.9K0
Android TRTC 推自定义采集的视频数据
TRTCSDK自定义采集YUV视频通话
摄像头通话功能,是TRTCSDK对系统摄像头进行了封装,采集摄像头数据,编码传输通话。
ppchao
2020/11/13
2.7K0
TRTCSDK自定义采集YUV视频通话
iOS 音视频采集
iOS的音视频采集用到了AVCaptureSession。关于AVCaptureSession,苹果的官方文档里的描述如下:
GF
2020/11/27
1.2K0
TRTCSDK自定义采集YUV视频通话
摄像头通话功能,是TRTCSDK对系统摄像头进行了封装,采集摄像头数据,编码传输通话。
ppchao
2020/12/02
3K0
TRTCSDK自定义采集YUV视频通话
Android移动直播,自定义采集视频数据推流
目前腾讯视频云移动直播SDK(LiteAVSDK)只回调摄像机预览画面的纹理数据。如果开发者集成第三方美颜库来实现美颜、滤镜等功能,但第三方库的美颜功能输入数据要求是camera的原始数据(YUV 数据)。开发者想实现该功能,需要采用自定义采集视频数据接口,然后复用 LiteAVSDK 的编码和推流功能。
腾讯云-chaoli
2019/03/13
5.1K3
Android移动直播,自定义采集视频数据推流
音视频基础能力之 iOS 视频篇(一):视频采集
涉及硬件的音视频能力,比如采集、渲染、硬件编码、硬件解码,通常是与客户端操作系统强相关的,就算是跨平台的多媒体框架也必须使用平台原生语言的模块来支持这些功能
声知视界
2024/11/15
2490
音视频基础能力之 iOS 视频篇(一):视频采集
libyuv的编译与使用
libyuv是Google开源的实现YUV数据格式转换,旋转,缩放和镜像等操作的库。
雪月清
2020/06/23
3.6K0
TRTCSDK自定义采集Texture2D视频通话
摄像头通话功能,是TRTCSDK对系统摄像头进行了封装,采集摄像头数据,编码传输通话。
ppchao
2020/12/03
1.3K1
TRTCSDK自定义采集Texture2D视频通话
iOS端 TRTC v2 自定义采集音频数据实现
实时音视频 TXLiteAVSDK_TRTC 默认通过调用 startLocalAudio: 接口实现音频的采集。如果开发者工程项目有自己的音频采集或者处理逻辑,SDK 也支持自定义音频采集方案:通过 TRTCCloud 的 enableCustomAudioCapture 接口关闭 TRTC SDK 默认的声音采集流程。然后您可以使用 sendCustomAudioData 接口向 TRTC SDK 填充您自己的声音数据。
腾讯云-chaoli
2019/07/07
2.2K1
iOS端 TRTC v2 自定义采集音频数据实现
Android Bitmap转I420的坑,以及图文详解YUV420数据格式
今天Android要把Bitmap里的数据转成I420,用的YUV库,但是总有色差。查了好久,最终发现
望天
2020/03/11
3.7K0
iOS摄像头采集和编码
使用AVCaptureSession创建采集会话,获取图像数据后通过VideoToolBox进行编码。
gongluck
2022/05/09
1K0
使用libyuv对YUV数据进行缩放,旋转,镜像,裁剪等操作
在Android做过自定义Camera的朋友应该都知道,我们可以通过public void onPreviewFrame(byte[] data, Camera camera)回调中获取摄像头采集到的每一帧的数据,但是这个byte[] data的数据格式YUV的,并不能直接给我们进行使用,那么该通过什么样的方法对这个YUV数据进行处理呢?
音视频开发进阶
2020/07/15
5K0
使用libyuv对YUV数据进行缩放,旋转,镜像,裁剪等操作
Android平台RTSP、RTMP播放端如何实现YUV或ARGB数据按设定角度旋转
做音视频RTSP或RTMP直播播放器的时候,不免会遇到这样的诉求,实时播放或快照的时候,由于前端摄像头安装角度不一定是正向,导致播放或快照的时候,视频view显示的画面是呈90° 180°甚至270°旋转的。
音视频牛哥
2022/10/16
6820
iOS AVDemo(12):视频解码,MP4 → H.264/H.265 → YUV 的源码丨音视频工程示例
iOS/Android 客户端开发同学如果想要开始学习音视频开发,最丝滑的方式是对音视频基础概念知识有一定了解后,再借助 iOS/Android 平台的音视频能力上手去实践音视频的采集 → 编码 → 封装 → 解封装 → 解码 → 渲染过程,并借助音视频工具来分析和理解对应的音视频数据。
关键帧
2022/06/13
6420
iOS AVDemo(12):视频解码,MP4 → H.264/H.265 → YUV 的源码丨音视频工程示例
NV12最近的邻居插值缩放和双线性插值缩放
有不同类型的图像缩放算法。它图像缩放算法的复杂性与图像质量损失和性能低下有关。我决定选择最简单的“最近邻居插值”和双线性插值,以调整NV12图像的大小。
Abalone
2022/07/14
2.4K0
NV12最近的邻居插值缩放和双线性插值缩放
Qt6 QML 中渲染自定义视频帧的改进 2023-05-30 更新
最近在升级音视频的项目 Qt 版本,从 5.15.0 升级到 6.4.3(6.5 也一样),除了一些 QML 中删除了一些 Qt Quick Controls 1 的控件以外,最重要的就是自定义视频渲染的改进。
我与梦想有个约会
2023/10/21
1.3K2
音视频面试题集锦第 17 期
CVPixelBufferRef 像素缓冲区,是 iOS 平台进行视频编解码及图像处理相关最重要的数据结构之一。它的定义是 typedef CVImageBufferRef CVPixelBufferRef。CVPixelBuffer 是在 CVImageBuffer 的基础上实现了内存存储。并且,CVPixelBuffer 还可以实现 CPU 和 GPU 共享内存,为图像处理提供更高的效率。
关键帧
2024/03/05
4900
音视频面试题集锦第 17 期
推荐阅读
相关推荐
iOS 不用 libyuv 也能高效实现 RGB/YUV 数据转换丨音视频工业实战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验