Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone AvassetWriteInput和readyForMoreMediaData_Iphone_Ios4_Iphone Sdk 3.0_Avfoundation_Avassetwriter - Fatal编程技术网

Iphone AvassetWriteInput和readyForMoreMediaData

Iphone AvassetWriteInput和readyForMoreMediaData,iphone,ios4,iphone-sdk-3.0,avfoundation,avassetwriter,Iphone,Ios4,Iphone Sdk 3.0,Avfoundation,Avassetwriter,AVAssetWriterInput的readyForMoreMediaData是否在后台线程中更新?如果readyForMoreMediaData为否,是否可以在主线程中阻塞,并等待该值更改为是 我正在使用AVAssetWriterInput,通过将数据推送到它(即不使用RequestMediaDataWhenRepayonQueue),我已经在实时设置了expectsMediaDataInRealTime,99.9%的时间我可以在它上调用appendSampleBuffer(或appendP

AVAssetWriterInput的readyForMoreMediaData是否在后台线程中更新?如果readyForMoreMediaData为否,是否可以在主线程中阻塞,并等待该值更改为是

我正在使用AVAssetWriterInput,通过将数据推送到它(即不使用RequestMediaDataWhenRepayonQueue),我已经在实时设置了expectsMediaDataInRealTime,99.9%的时间我可以在它上调用appendSampleBuffer(或appendPixelBuffer),速度与我的应用程序生成帧的速度一样快

<>这很好,除非你把设备(iPhone 3GS)放在一个avaseTeX会话中间15分钟左右。唤醒设备后,appendPixelBuffer有时会出现一个错误,提示“readyForMoreMediaData为否时无法追加像素缓冲区”。因此,我的问题是——如何最好地响应readyForMoreMediaData=NO,以及我是否可以像这样在主线程中稍等片刻:

while ( ![assetWriterInput readyForMoreMediaData] )
{
    Sleep for a few milliseconds
}

小心不要只是阻塞线程,以下是我之前所做的不起作用的操作:

while (adaptor.assetWriterInput.readyForMoreMediaData == FALSE) {
  [NSThread sleepForTimeInterval:0.1];
}
在我的iPad2上,上述方法有时会失败。这样做反而解决了问题:

while (adaptor.assetWriterInput.readyForMoreMediaData == FALSE) {
  NSDate *maxDate = [NSDate dateWithTimeIntervalSinceNow:0.1];
  [[NSRunLoop currentRunLoop] runUntilDate:maxDate];
}

没有找到类似的东西,所以我把它放在这里了Swift 4解决方案。 最好使用精确的技术来解决这个问题。F.e.使用N条件:

func startRecording() {
        // start recording code goes here 

    readyForMediaCondition = NSCondition()
    readyForMediaObservation = pixelBufferInput?.assetWriterInput.observe(\.isReadyForMoreMediaData, options: .new, changeHandler: { [weak self](_, change) in
        guard let isReady = change.newValue else {
            return
        }

        if isReady {
            self?.readyForMediaCondition?.lock()
            self?.readyForMediaCondition?.signal()
            self?.readyForMediaCondition?.unlock()
        }
    })
}
下一步:

最后别忘了让观察者失效

readyForMediaObservation?.invalidate()

嗨@MoDJ-我可能遗漏了什么,但看起来你在两种方法中都试图“睡眠”0.1秒-但在第二种方法中,你没有睡眠。代码并不是这个意思,我也可以从日志中看到……在运行循环中调用runUntilDate与睡眠不同。运行循环可以做其他事情,如响应异步IO准备就绪或NSNotification传递。这里的要点是readyForMoreMediaData标志可能是由一个运行循环操作设置的,这似乎是iPad2正在进行的操作。所以它是RunUntelDate“不包括self”?我想这就是我错过的。Dapple提供了一些详细的运行循环文档:我不敢相信这是最佳实践。为什么KVO不工作?我也试过了。嗨,杰夫,欢迎来到社区。1.你应该指出提问者哪里出了问题,2。你应该解释你的解决方案。
readyForMediaObservation?.invalidate()
        int waitTime = 300;
        while (weakSelf.input.readyForMoreMediaData == NO) {
            NSLog(@"readyForMoreMediaData is NO");
            NSTimeInterval waitIntervale = 0.001 * waitTime;
            NSDate *maxDate = [NSDate dateWithTimeIntervalSinceNow:waitIntervale];
            [[NSRunLoop currentRunLoop] runUntilDate:maxDate];
            waitTime += 200; // add 200ms every time
        }