AVAssetWriter аудио с видео вместе - PullRequest
1 голос
/ 07 декабря 2011

Я пытался написать простую демо-версию для захвата видео со звуком с iphone (как в игровом рекордере). После поиска некоторых решений я нашел следующие материалы:

-(void) startScreenRecording 
{   
    NSLog(@"start screen recording");

    // create the AVAssetWriter
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *moviePath = [documentPath stringByAppendingPathComponent: @"/video.mov"];
    NSLog(@"moviePath:%@", moviePath);
    if ([[NSFileManager defaultManager] fileExistsAtPath:moviePath]) 
    {   
        [[NSFileManager defaultManager] removeItemAtPath:moviePath error:nil];
    }

    NSURL *movieURL = [NSURL fileURLWithPath:moviePath];
    NSError *movieError = nil;

    [assetWriter release];
    assetWriter = [[AVAssetWriter alloc] initWithURL:movieURL
                                            fileType: AVFileTypeQuickTimeMovie
                                               error: &movieError];
    NSDictionary *assetWriterInputSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                              AVVideoCodecH264, AVVideoCodecKey,
                                              [NSNumber numberWithInt:FRAME_WIDTH], AVVideoWidthKey,
                                              [NSNumber numberWithInt:FRAME_HEIGHT], AVVideoHeightKey,
                                              nil];
    assetWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType: AVMediaTypeVideo
                                                          outputSettings:assetWriterInputSettings];
    assetWriterInput.expectsMediaDataInRealTime = YES;
    [assetWriter addInput:assetWriterInput];

    [assetWriterPixelBufferAdaptor release];
    assetWriterPixelBufferAdaptor =  [[AVAssetWriterInputPixelBufferAdaptor  alloc]
                                      initWithAssetWriterInput:assetWriterInput
                                      sourcePixelBufferAttributes:nil];
    [assetWriter startWriting];

    firstFrameWallClockTime = CFAbsoluteTimeGetCurrent();
    [assetWriter startSessionAtSourceTime: CMTimeMake(0, TIME_SCALE)];

    // start writing samples to it
    [assetWriterTimer release];
    assetWriterTimer = [NSTimer scheduledTimerWithTimeInterval:0.1
                                                        target:self
                                                      selector:@selector (writeSample:)
                                                      userInfo:nil
                                                       repeats:YES];    
}

-(void) writeSample: (NSTimer*) _timer 
{   
    if (assetWriterInput.readyForMoreMediaData) 
    {
        CVReturn cvErr = kCVReturnSuccess;

        // get screenshot image!
        CGImageRef image = (CGImageRef) [[self createARGBImageFromRGBAImage:[AWScreenshot takeAsImage]] CGImage];

        // prepare the pixel buffer
        CVPixelBufferRef pixelBuffer = NULL;
        CFDataRef imageData= CGDataProviderCopyData(CGImageGetDataProvider(image));
        cvErr = CVPixelBufferCreateWithBytes(kCFAllocatorDefault,
                                             FRAME_WIDTH,
                                             FRAME_HEIGHT,
                                             kCVPixelFormatType_32ARGB,
                                             (void*)CFDataGetBytePtr(imageData),
                                             CGImageGetBytesPerRow(image),
                                             NULL,
                                             NULL,
                                             NULL,
                                             &pixelBuffer);

        // calculate the time
        CFAbsoluteTime thisFrameWallClockTime = CFAbsoluteTimeGetCurrent();
        CFTimeInterval elapsedTime = thisFrameWallClockTime - firstFrameWallClockTime;
        //NSLog (@"elapsedTime: %f", elapsedTime);
        CMTime presentationTime =  CMTimeMake (elapsedTime * TIME_SCALE, TIME_SCALE);

        // write the sample
        BOOL appended = [assetWriterPixelBufferAdaptor appendPixelBuffer:pixelBuffer withPresentationTime:presentationTime];

        if (appended) 
        {   
            NSLog (@"appended sample at time %lf", CMTimeGetSeconds(presentationTime));
        } 
        else 
        {   
            NSLog (@"failed to append");
            [self stopScreenRecording];
        }
    }
}

И файл видео (.mov) успешно создан ...

Но теперь я бы хотел записать звук с iphone (скажем, какой-нибудь звуковой эффект и включить музыку во время игры) вместе с видео ...

Я искал в сети, и все, что я получил, это решения о том, "как объединить уже существующий звуковой файл с уже существующим фильмом" ...

Должен ли я записывать аудио и видео отдельно, а затем объединять их после записи? Есть ли способ захватить их вместе?

Любое предложение будет высоко ценится, спасибо:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...