开发者

avfoundation: appendPixelBuffer withPresentationTime, adaptor not ready

开发者 https://www.devze.com 2023-02-15 09:43 出处:网络
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.

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

Tommaso


try 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.

0

精彩评论

暂无评论...
验证码 换一张
取 消