这里有来自iOS8的新硬件解码方法,
我们可以使用“VTDecompressionSessionDecodeFrame”从 iOS8 解码 h264,
我尝试编写一个能够打印硬件解码 fps 的程序,
但是这里有个问题,回调是异步的,
那么我怎样才能准确计算 fps?
我找到了一个方法“VTDecompressionSessionWaitForAsynchronousFrames”
这是我想要的吗?
Decode Function
- (void)render:(CMSampleBufferRef)sampleBuffer
{
if (_isDecoding == NO) {
_isDecoding = YES;
_lastTime = [NSDate date];
}
VTDecodeFrameFlags flags = kVTDecodeFrame_EnableAsynchronousDecompression;
VTDecodeInfoFlags flagOut;
VTDecompressionSessionDecodeFrame(_decompression, sampleBuffer, flags, NULL, &flagOut);
VTDecompressionSessionWaitForAsynchronousFrames(_decompression);
if (_gotFrame == YES) {
_gotFrame = NO;
_isDecoding = NO;
}
CFRelease(sampleBuffer);
}
Decode Callback Function
void didDecompress( void *decompressionOutputRefCon, void *sourceFrameRefCon, OSStatus status, VTDecodeInfoFlags infoFlags, CVImageBufferRef imageBuffer, CMTime presentationTimeStamp, CMTime presentationDuration ){
VideoView* THIS = (__bridge VideoView*)decompressionOutputRefCon;
THIS->_gotFrame = YES;
NSDate* currentTime = [NSDate date];
NSTimeInterval runTime = currentTime.timeIntervalSince1970 - THIS->_lastTime.timeIntervalSince1970;
THIS->_totalTime += runTime;
THIS->_counts++;
THIS->_lastTime = currentTime;
}
最佳答案
我们可以将 NSDate 设置为 sourceRefCon,然后从回调中访问时间戳以获取准确的解码时间。
void * sourceFrameRefCon in VTDecompressionSessionDecodeFrame
VTDecompressionSessionDecodeFrame(
VTDecompressionSessionRef session,
CMSampleBufferRef sampleBuffer,
VTDecodeFrameFlags decodeFlags, // bit 0 is enableAsynchronousDecompression
void * sourceFrameRefCon,
VTDecodeInfoFlags *infoFlagsOut /* may be NULL */ )
Decode Method
- (void)render:(CMSampleBufferRef)sampleBuffer
{
VTDecodeFrameFlags flags = kVTDecodeFrame_EnableAsynchronousDecompression;
VTDecodeInfoFlags flagOut;
NSDate* currentTime = [NSDate date];
VTDecompressionSessionDecodeFrame(_decompression, sampleBuffer, flags, (void*)CFBridgingRetain(currentTime), &flagOut);
CFRelease(sampleBuffer);
}
Decode Callback Method
void didDecompress( void *decompressionOutputRefCon, void *sourceFrameRefCon, OSStatus status, VTDecodeInfoFlags infoFlags, CVImageBufferRef imageBuffer, CMTime presentationTimeStamp, CMTime presentationDuration ){
NSDate* currentTime = (__bridge NSDate *)sourceFrameRefCon;
if (currentTime != nil) {
//Do something
}
}
关于ios - 如何准确计算 iOS 8 上硬件解码的 FPS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25840482/