2011-05-04 2 views
4

백그라운드 스레드에서 AVAssetWriterInput의 readyForMoreMediaData가 업데이트 되었습니까? readyForMoreMediaData가 NO이면 기본 스레드에서 차단하고 값이 YES로 변경 될 때까지 기다릴 수 있습니까?AVAssetWriterInput 및 readyForMoreMediaData

나는 (requestMediaDataWhenReadyOnQueue를 사용하지 않고 IE)이 데이터를 밀어하여 AVAssetWriterInput을 사용하고 있는데 나는 expectsMediaDataInRealTime을 설정 한, 시간의 99.9 %가 난 그냥 내 응용 한 빨리 그것을 appendSampleBuffer (또는 appendPixelBuffer)를 호출 할 수 있습니다 프레임을 생성 할 수 있습니다.

AVAssetWriter 세션 도중 15 분 정도 기기를 잠자기 상태로 설정하지 않으면 정상적으로 작동합니다. 장치를 깨우면 appendPixelBuffer에 "readyForMoreMediaData가 NO 인 경우 픽셀 버퍼를 추가 할 수 없습니다."라는 오류가 표시되는 경우가 있습니다.

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

답변

3

여기, 바로 스레드를 차단하지 않도록주의 내가 전에 무엇을하고 있었는지된다 - 따라서 내 질문에 내가 너무처럼 메인 쓰레드에서 조금 기다릴 수 있다면 최선의 방법 readyForMoreMediaData = NO에 반응하는 그게 작동하지 않았다 :

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]; 
} 
+0

안녕 @MoDJ - 내가 뭔가를 누락 될 수 있습니다,하지만 당신은 두 가지 접근 방식에서에 "절전"0.1 초를하려는 것 같습니다 -하지만 두 번째, 당신은하지 않습니다 자고. 코드가 그것을 의미하는 것은 아니며 로그에서도 볼 수 있습니다. –

+2

실행 루프에서 runUntilDate를 호출하는 것은 sleep과 동일하지 않습니다. 실행 루프는 비동기 IO가 준비 상태가되거나 NSNotification 전달과 같은 다른 작업을 수행 할 수 있습니다. 요점은 readyForMoreMediaData 플래그가 실행 루프 작업 중 하나에 의해 설정 될 수 있다는 것입니다. 이는 iPad2에서 진행되고있는 것으로 보입니다. – MoDJ

+0

그래서 runUntilDate는 "자기 포함 안함"입니까? 그게 내가 놓친 것 같아 –