我有一个关于在ios8上的VideoToolbox中使用VTCompressionSession的问题。
我的VTCompressionSession设置正确,没有返回错误代码。然而,当我尝试使用VTCompressionSessionEncodeFrame对我的帧进行编码时,我得到了一个OSStatus错误代码-12780。我找不到对这种错误代码的任何定义或解释。有人有什么想法吗?
以下是我的代码片段:
CVPixelBufferRef input_frame_buffer_;
void* plane_ptrs[3] = {frame->channel[0], frame->channel[1], frame->channel[3]};
size_t plane_widths[3] = {frame->header.width,
frame->header.width / 2, frame->header.width / 2};
size_t plane_heights[3] = {frame->header.height,
frame->header.height / 2, frame->header.height / 2};
size_t plane_bytes_per_row[3] = {frame->stride[0], frame->stride[1], frame->stride[2]};
CVReturn pixel_buffer_status =
CVPixelBufferCreateWithPlanarBytes(kCFAllocatorDefault,
frame->header.width,
frame->header.height,
(OSType) kCVPixelFormatType_420YpCbCr8Planar,
frame->channel[0],
0,
3,
plane_ptrs,
plane_widths,
plane_heights,
plane_bytes_per_row,
&MyPixelBufferReleaseCallback,
(void*)this,
nullptr,
&input_frame_buffer_);
if (pixel_buffer_status != kCVReturnSuccess) {
logger_->Error("CVPixelBufferCreateWithBytes failed.");
return;
}
VTEncodeInfoFlags info_flags;
OSStatus status = VTCompressionSessionEncodeFrame(session_,
input_frame_buffer_, frame->header.pts, kCMTimeInvalid, nullptr,
mySourceFrameRefCon,
&info_flags);
我以前也有同样的问题,你可以按照下面的步骤操作
- 列出项目
//1。获取SPS、PPS表单流数据,并创建CMFormatDescription、VTDecompressionSession
//2。创建CMFormatDescription
//3。创建VT解压缩会话
//4。将NALUnit有效载荷放入CMBlockBuffer
//5。确保将分隔符代码替换为4字节长度的代码(包括单位代码的NalUnit的长度)
//6。创建CMSampleBuffer
//7。使用VTDecompressionSessionDecodeFrame
//8。使用VideoToolBox解压缩帧回调以获得CVImageBufferRef
你可以在我的git中找到参考资料https://github.com/htaiwan/HWDecoder
看起来需要为dataSize
参数传递一个值。请参阅我在苹果开发者论坛上的回答和以下示例代码:https://gist.github.com/roxlu/79e50d2ac869763d712d
roxlu
解决方案是使用VTCompressionSesion中的像素缓冲池。
https://devforums.apple.com/message/1063536#1063536