Iphone AvassetWriteInput和readyForMoreMediaData
AVAssetWriterInput的readyForMoreMediaData是否在后台线程中更新?如果readyForMoreMediaData为否,是否可以在主线程中阻塞,并等待该值更改为是 我正在使用AVAssetWriterInput,通过将数据推送到它(即不使用RequestMediaDataWhenRepayonQueue),我已经在实时设置了expectsMediaDataInRealTime,99.9%的时间我可以在它上调用appendSampleBuffer(或appendPixelBuffer),速度与我的应用程序生成帧的速度一样快 <>这很好,除非你把设备(iPhone 3GS)放在一个avaseTeX会话中间15分钟左右。唤醒设备后,appendPixelBuffer有时会出现一个错误,提示“readyForMoreMediaData为否时无法追加像素缓冲区”。因此,我的问题是——如何最好地响应readyForMoreMediaData=NO,以及我是否可以像这样在主线程中稍等片刻: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
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
}