6

私がしたいのは、ビデオ (ローカル ファイルとリモート URL のいずれか) とそのオーディオ トラックを再生し、ビデオの各フレームのピクセル バッファーを取得して OpenGL テクスチャに描画することです。

iOS 6で使用するコードは次のとおりです(正常に動作します):

ビデオを開始する

- (void) readMovie:(NSURL *)url {
    NSLog(@"Playing video %@", param.url);

    AVURLAsset * asset = [AVURLAsset URLAssetWithURL:url options:nil];
    [asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler:
     ^{
         dispatch_async(dispatch_get_main_queue(),
                        ^{
                            NSError* error = nil;
                            AVKeyValueStatus status = [asset statusOfValueForKey:@"tracks" error:&error];
                            if (status == AVKeyValueStatusLoaded) {
                                NSDictionary* settings = @{ (id)kCVPixelBufferPixelFormatTypeKey : [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] };
                                AVPlayerItemVideoOutput* output = [[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:settings];
                                AVPlayerItem* playerItem = [AVPlayerItem playerItemWithAsset:asset];
                                [playerItem addOutput:output];
                                AVPlayer* player = [AVPlayer playerWithPlayerItem:playerItem];

                                [self setPlayer:player];
                                [self setPlayerItem:playerItem];
                                [self setOutput:output];

                                [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(bufferingVideo:) name:AVPlayerItemPlaybackStalledNotification object:nil];
                                [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoEnded:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
                                [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoFailed:) name:AVPlayerItemFailedToPlayToEndTimeNotification object:nil];

                                [[self player] addObserver:self forKeyPath:@"rate" options:0 context:nil];
                                [[self player] addObserver:self forKeyPath:@"status" options:0 context:NULL];

                                [player play];
                            } else {
                                NSLog(@"%@ Failed to load the tracks.", self);
                            }
                        });
     }];
}

ビデオ バッファを読み取ります (各フレームと呼ばれる更新関数で)

- (void) readNextMovieFrame {

    CMTime outputItemTime = [[self playerItem] currentTime];

    float interval = [self maxTimeLoaded];

    CMTime t = [[self playerItem] currentTime];
    CMTime d = [[self playerItem] duration];
    NSLog(@"Video : %f/%f (loaded : %f) - speed : %f", (float)t.value / (float)t.timescale, (float)d.value / (float)d.timescale, interval, [self player].rate);

    [videoBar updateProgress:(interval / CMTimeGetSeconds(d))];
    [videoBar updateSlider:(CMTimeGetSeconds(t) / CMTimeGetSeconds(d))];

    if ([[self output] hasNewPixelBufferForItemTime:outputItemTime]) {
        CVPixelBufferRef buffer = [[self output] copyPixelBufferForItemTime:outputItemTime itemTimeForDisplay:nil];

        // Lock the image buffer
        CVPixelBufferLockBaseAddress(buffer, 0);

        // Get information of the image
        uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(buffer);
        size_t width = CVPixelBufferGetWidth(buffer);
        size_t height = CVPixelBufferGetHeight(buffer);

        // Fill the texture
        glBindTexture(GL_TEXTURE_2D, texture);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, baseAddress);

        // Unlock the image buffer
        CVPixelBufferUnlockBaseAddress(buffer, 0);
        //CFRelease(sampleBuffer);
        CVBufferRelease(buffer);

    }
}

したがって、このコードは iOS 6 で正常に動作し、iOS 5 で実行したいのですがAVPlayerItemVideoOutput、iOS 5 の一部ではないため、引き続きビデオを再生できますが、各フレームのピクセル バッファーを取得する方法がわかりません。ビデオ。

AVPlayerItemVideoOutputビデオの各フレームのピクセル バッファを取得する代わりに、何を使用できるか考えていますか? (ローカル ビデオとリモート ビデオの両方で動作する必要があり、オーディオ トラックも再生したい)。

ご助力ありがとうございます !

4

0 に答える 0