avfoundation: appendPixelBuffer withPresentationTime, adaptor not ready
I use the following code to create a video from a sequence of images stored into an array (takenImages). Duration is the frame duration in seconds.
Everything is then saved to library.
My problem is that if I run with debugger on, the video is saved perfectly but if I run without debugger the video is not saved entirely (just the first frames were saved).
int timescale = duration * [takenImages count];
for (int i = 0; i < [takenImages count]; i++) {
CVPixelBufferRef buffer = NULL;
buffer = [self pixelBufferFromCGImage:[[takenImages objectAtIndex:i] CGImage]];
BOOL append_ok = NO;
int j = 0;
while (!append_ok && j < 30) {
if (adaptor.assetWriterInput.readyForMoreMediaData) {
printf("appending %d attemp %d\n", i, j);
append_ok = [adaptor appendPixelBuffer:buffer withPresentationTime:CMTimeMake(i*duration,timescale)];
} else {
printf("adaptor not ready %d, %d\n", i, j);
[NSThread sleepForTimeInterval:0.1];
}
j++;
}
if (!append_ok) {
printf("error appending image %d times %d\n", i, j);
}
}
this is an example of what I have in console after running (debugger off):
appending 0 attemp 0
appending 1 attemp 0
adaptor not ready 2, 0
adaptor not ready 2, 1
adaptor not ready 2, 2
adaptor not ready 2, 3
adaptor not ready 2, 4
adaptor not ready 2, 5
adaptor not ready 2, 6
adaptor not ready 2, 7
adaptor not ready 2, 8
adaptor not ready 2, 9
adaptor not ready 2, 10
adaptor not ready 2, 11
adaptor not ready 2, 12
adaptor not ready 2, 13
adaptor not ready 2, 14
adaptor not ready 2, 15
adaptor not ready 2, 16
adaptor not ready 2, 17
adaptor not ready 2, 18
adaptor not ready 2, 19
adaptor not ready 2, 20
adaptor not ready 2, 21
adaptor not ready 2, 22
adaptor not ready 2, 23
adaptor not ready 2, 24
adaptor not ready 2, 25
adaptor not ready 2, 26
adaptor not ready 2, 27
adaptor not ready 2, 28
adaptor not ready 2, 29
error appending image 2 times 30
adaptor not ready 3, 0
adaptor not ready 3, 1
adaptor not ready 3, 2
adaptor not ready 3, 3
adaptor not ready 3, 4
adaptor not ready 3, 5
adaptor not ready 3, 6
adaptor not ready 3, 7
adaptor not ready 3, 8
adaptor not ready 3, 9
adaptor not ready 3, 10
adaptor not ready 3, 11
adaptor not ready 3, 12
adaptor not ready 3, 13
adaptor not ready 3, 14
adaptor not ready 3, 15
adaptor not ready 3, 16
adaptor not ready 3, 17
adaptor not ready 3, 18
adaptor not ready 3, 19
adaptor not ready 3, 20
adaptor not ready 3, 21
adaptor not ready 3, 22
adaptor not ready 3, 23
adaptor not ready 3, 24
adaptor not ready 3, 25
adaptor not ready 3, 26
adaptor not ready 3, 27
adaptor not ready 3, 28
adaptor not ready 3, 29
error appending image 3 times 30
adaptor not ready 4, 0
adaptor not ready 4, 1
adaptor not ready 4, 2
adaptor not ready 4, 3
adaptor not ready 4, 4
adaptor not ready 4, 5
adaptor not ready 4, 6
adaptor not ready 4, 7
adaptor not ready 4, 8
adaptor not ready 4, 9
adaptor not ready 4, 10
adaptor not ready 4, 11
adaptor not ready 4, 12
adaptor not ready 4, 13
adaptor not ready 4, 14
adaptor not ready 4, 15
adaptor not ready 4, 16
adaptor not ready 4, 17
adaptor not ready 4, 18
adaptor not ready 4, 19
adaptor not ready 4, 20
adaptor not ready 4, 21
adaptor not ready 4, 22
adaptor not ready 4, 23
adaptor not ready 4, 24
adaptor not ready 4, 25
adaptor not ready 4, 26
adaptor not ready 4, 27
adaptor not ready 4, 28
adaptor not ready 4, 29
error appending image 4 times 30
开发者_开发技巧
Any suggestion?
Thanks a lot in advance.
bye
Tommasotry this when setting the buffers.
[adaptor appendPixelBuffer:buffer withPresentationTime:presentTime];
if(buffer)
CVBufferRelease(buffer);
[NSThread sleepForTimeInterval:0.05];
writerInput.expectsMediaDataInRealTime = YES;
It is more proper to use requestMediaDataWhenReadyOnQueue:usingBlock:
on your writerInput object. When it is ready for input again it'll call the block again.
精彩评论