我想用VToolBox压缩一些数据。当我在前台运行我的应用程序时,它运行良好,但是当我在后台运行我的应用程序时,它不再提供压缩数据......
我在编码开始时添加了日志:
- (void) encode1:(CMSampleBufferRef )sampleBuffer wrapTs:(UInt64)ts;
{
dispatch_sync(aQueue, ^{
frameCount++;
// Get the CV Image buffer
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
// Create properties
CMTime presentationTimeStamp = CMTimeMake(frameCount, 1000);
//CMTime duration = CMTimeMake(1, DURATION);
VTEncodeInfoFlags flags;
//NSLog(@"encode sessino status:%d", EncodingSession==nil? 0:1);
// Pass it to the encoder
OSStatus statusCode = VTCompressionSessionEncodeFrame(EncodingSession,
imageBuffer,
presentationTimeStamp,
kCMTimeInvalid,
NULL, (__bridge void*)@(ts), &flags);
NSLog(@"hardware compress result: %d", (int)statusCode);
// Check for error
if (statusCode != noErr) {
并在压缩回调中:
void didCompressH264(void *outputCallbackRefCon, void *sourceFrameRefCon, OSStatus status, VTEncodeInfoFlags infoFlags,
CMSampleBufferRef sampleBuffer ){
//get outside stamp
UInt64 pp = [((__bridge NSNumber*)sourceFrameRefCon) longLongValue];
NSLog(@"didCompressH264 status:%d", status);
if (status != 0) return;
if (!CMSampleBufferDataIsReady(sampleBuffer))
{
NSLog(@"didCompressH264 data is not ready ");
return;
}
当我在后台运行应用程序时,我可以看到日志"硬件压缩结果:0"这意味着将数据放入VToolBox中,但我无法获得log" didCompressH264 status"。
它似乎永远不会达到didCompressH264
功能。
所以,我想知道VToolBox是否可以在后台运行?如果是这样,怎么样?任何答案都表示赞赏!
答案 0 :(得分:0)
iOS不会让你的应用永远在后台运行。默认情况下,在应用程序移至后台后,它将为您提供几秒钟的运行时间。除此之外,它将阻止应用程序运行或杀死它。
您可以在AppDelegate的beginBackgroundTaskWithName:expirationHandler:
方法中使用applicationDidEnterBackground:
要求更多时间。您可以查看iOS为您提供的backgroundTimeRemaining
多长时间。除此之外,你的应用程序将被杀死。
请注意,相当多的事情在后台不起作用。不确定库使用了哪些资源,但是如果你在后台完全访问GPU,我会感到惊讶。
答案 1 :(得分:0)
只要您的应用进入背景,VideoToolbox就会停止解压缩/压缩帧。仅在前台应用程序上允许硬件加速以提供最佳体验。