关于libyuv ios 怎么使用 相信大家都有办法 从网上找到,这里就不多说了,
为什么这里要写一遍裁剪的文章呢, 就是因为网上基本找不到这方面的文章,都是关于数据格式转换的,n12->i420 等等。裁剪也有说,但是说的 含含糊糊的。
ConvertToI420 这个是剪裁的方法,这个方法的用途就是把任意格式的数据转化为i420,并且是裁剪原图的一块区域转化。并不需要 先把数据数据转化为i420 然后再去 裁剪。
int ConvertToI420(const uint8* src_frame, size_t src_size,
uint8* dst_y, int dst_stride_y,
uint8* dst_u, int dst_stride_u,
uint8* dst_v, int dst_stride_v,
int crop_x, int crop_y,
int src_width, int src_height,
int crop_width, int crop_height,
enum RotationMode rotation,
uint32 format);
src_frame:源数据的其实位置
src_size:源数据的大小
rormat:元数据的格式
贴一段转换的代码,数据framebuffer 是从 webrtc 本事render 回调过来的。暂时不知道rotation的用法,只是默认传了0,已经达到我手动转码剪裁的效果了。
RTCCVPixelBuffer *buffer = frame.buffer;
CVPixelBufferRef pbuffer = buffer.pixelBuffer;
CVPixelBufferLockBaseAddress(pbuffer, 0);
size_t src_stride_y = CVPixelBufferGetBytesPerRowOfPlane(pbuffer, 0);
size_t src_stride_uv = CVPixelBufferGetBytesPerRowOfPlane(pbuffer, 1);
uint8_t *src_data_y = CVPixelBufferGetBaseAddressOfPlane(pbuffer, 0);
uint8_t *src_data_uv = CVPixelBufferGetBaseAddressOfPlane(pbuffer, 1);
CVPixelBufferUnlockBaseAddress(pbuffer, 0);
RTCI420Buffer *i420buffer = [[RTCI420Buffer alloc] initWithWidth:frame.width/2 height:frame.height/2];
ConvertToI420(src_data_y, frame.width*frame.height*1.5,
(void *)i420buffer.dataY, i420buffer.strideY,
(void *)i420buffer.dataU, i420buffer.strideU,
(void *)i420buffer.dataV, i420buffer.strideV,
0,0,
frame.width, frame.height,
frame.width/2, frame.height/2,
kRotate0, FOURCC_NV12);