iOS-WebRTC怎么获取某帧图像

本文介绍了在iOS WebRTC开发中如何获取视频通话中的某帧图像,并处理旋转和镜像问题。通过遵循RTCVideoRenderer协议,结合RTCVideoFrame的rotation属性调整图像方向,以及将YUVI420数据转换为UIImage。文章提供了关键代码示例,并指出webrtc内部使用kCVPixelFormatType_420YpCbCr8BiPlanarFullRange格式获取视频流。

这篇文章主要是在开发中遇到了,需要在视频通话时,取出某帧图像,针对这帧图做后续操作的求,话不多说,直接画重点。

相信搜这个问题的兄弟基本已经开发了一段时间的WebRTC,所以下面不做基础的介绍,直接告诉你位置。

使用的webrtc版本为2018年3月的某个版本,具体记不清了。当我们创建本地视频流的时候都会用到如下代码

#pragma mark -- 创建本地视频流
​
- (RTCVideoTrack *)createLocalVideoTrack:(CameraPosition)cameraPosition { RTCMediaConstraints *cameraConstraints = [[RTCMediaConstraints alloc] initWithMandatoryConstraints:[self currentMediaConstraint] optionalConstraints: nil];
​
RTCAVFoundationVideoSource *source = [self.factory avFoundationVideoSourceWithConstraints:cameraConstraints];
​
RTCVideoTrack *localVideoTrack = [self.factory videoTrackWithSource:source trackId:kARDVideoTrackId];
​
//这里是重点,找到你项目中创建的本地RTCVideoTrack(这个在开发中一定是会用到的,细心找下就好,创建方法应该都和我写的这个函数类似),然后添加代理到本地,有兴趣的朋友可以点进RTCVideoTrack类里看下方法,在某个类添加代理后,并实现代理方法,便可以在这个类里回调回来视频的每一帧图片了
​
[localVideoTrack addRenderer:self];
​
localView上 self.localView.captureSession = source.captureSession;
​
return localVideoTrack;
​
}

记得在加代理的类里加上遵循协议,上面代码里[localVideoTrack addRenderer:self];这里面的self就是JanusServiceManager这个类

@interface JanusServiceManager()<RTCVideoRenderer>

再然后在你这个类里实现代理方法

#pragma mark -- RTCVideoRenderer---------------添加这个代理获取webrtc内部buffer转换image
​
- (UIImage *)renderFrame:(RTCVideoFrame *)frame {
​
//代理方法只能获取到RTCVideoFrame,感兴趣的可以在你项目里点进去看下里面的构成,我们下面做的就是从RTCVideoFrame里特有的buffer内转换成我们传统用到的UIImage,当然这个buffer还可以转成其他的格式供开发者使用,这个就看个人需求了,我这里只做一个普遍需求的转换
​
UIImage *image = [janusFactory convertRTVFrameToUIImage:frame rotation:frame.rotation isBackCamera:self.AVFoundationVideoSource.useBackCamera];
​
return image;
​
}
​
//下面这个是代理的另外一个方法,放在这就行,不用做任何操作,因为是必须实现的,不写会崩溃
​
- (void)setSize:(CGSize)size {
​
}

接下来是转换

传入RTCVideoFrame 后面的rotation是webrtc内部的一个枚举值,因为大家都知道摄像头取出来的图片经常由于你的横竖屏不同,取到的原始图片的rotation的都是不一样的,webrtc这里都会给出原始图片的旋转角度,rotation是为转换为UIImage成功之后,要把UIImage在旋转成正确的方向,这里的旋转方向可能见仁见智了,总之,只要你的UIImage能转成功,再去变化旋转都不是问题。isBackCamera是webrtc返回的用的是前摄像头还是后摄像头的参数,这个参数会影响最后图片的左右,后摄像头没有问题,前摄像头会发现图片被左右镜像转换了,需要再转回来。

 【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发

【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值