我有一个关于在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);
答案 0 :(得分:1)
之前我遇到同样的问题,您可以按照以下步骤操作
// 1.获取SPS,PPS表单流数据,并创建CMFormatDescription,VTDecompressionSession
// 2.创建CMFormatDescription
// 3.创建VTDecompressionSession
// 4.将NALUnit有效负载转换为CMBlockBuffer
// 5.确保用4字节长度的代码替换分隔符代码(NalUnit的长度,包括单位代码)
// 6.创建CMSampleBuffer
// 7.使用VTDecompressionSessionDecodeFrame
// 8.使用VideoToolBox解压缩Frame CallBack获取CVImageBufferRef
你可以在我的git https://github.com/htaiwan/HWDecoder
中获得参考答案 1 :(得分:0)
看起来您需要传递dataSize
参数的值。请参阅Apple开发者论坛上的答案以及此示例代码:https://gist.github.com/roxlu/79e50d2ac869763d712d
roxlu
答案 2 :(得分:0)
解决方案是使用VTCompressionSesion中的像素缓冲池。