Avfoundation: appendPixelBuffer withPresentationTime, adapter not ready

I use the following code to create a video from a sequence of images stored in an array (tookImages). Duration is the frame duration in seconds.

Then everything is saved in the library.

My problem is that if I run with the debugger turned on, the video is saved perfectly, but if I run without the debugger, the video is not saved completely (only 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 the console after starting (the debugger is 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?

Thank you very much in advance.

bye
Tommaso

+3
source share
4 answers

try this when tuning buffers.

[adaptor appendPixelBuffer:buffer withPresentationTime:presentTime];
if(buffer)
    CVBufferRelease(buffer);
[NSThread sleepForTimeInterval:0.05];
+5
source

writerInput.expectsMediaDataInRealTime = YES;

+1

It is more correct to use requestMediaDataWhenReadyOnQueue:usingBlock:for the writerInput object. When it is ready to enter again, it will call the block again.

+1
source

Try using @autoreleasepool for codes inside the loop. This frees up unused memory in each loop, rather than releasing all of them until the loop ends.

-1
source

Source: https://habr.com/ru/post/1796397/


All Articles