Avfoundation通过录制创建迷你剪辑

时间:2012-08-20 14:42:01

标签: iphone objective-c ios5 avfoundation

我想知道如何在不停止录制的情况下从录制中每隔一段时间创建迷你视频?我试图为视频寻找相当于AvAssetImageGenerator的例子,这样做会很好。

1 个答案:

答案 0 :(得分:3)

最简单的方法是使用两个AVAssetWriters并设置下一个编写器,而当前的编写器正在录制,然后在x时间后停止并交换编写器。你应该能够交换作者而不丢弃任何帧。

编辑:

如何做AVAssetWriter"杂耍"

步骤1:为编写器和pixelbuffer适配器创建实例对象(并且您也希望知道这些文件的文件名)

AVAssetWriter*                        mWriter[2];
AVAssetWriterInputPixelBufferAdaptor* mPBAdaptor[2];
NSString*                             mOutFile[2];
int                                   mCurrentWriter, mFrameCount, mTargetFrameCount;

第2步:创建一个设置作者的方法(因为你一遍又一遍地这样做)

-(int) setupWriter: (int) writer
{
NSAutoreleasePool* p = [[NSAutoreleasePool alloc] init];

NSDictionary* writerSettings = [NSDictionary dictionaryWithObjectsAndKeys: AVVideoCodecH264, AVVideoCodecKey, [NSNumber numberWithInt: mVideoWidth], AVVideoWidthKey, [NSNumber numberWithInt: mVideoHeight], AVVideoHeightKey, nil];
NSDictionary* pbSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:mVivdeoWidth],kCVPixelBufferWidthKey,
                        [NSNumber numberWithInt:mVideoHeight], kCVPixelBufferHeightKey,
                        [NSNumber numberWithInt:0],kCVPixelBufferExtendedPixelsLeftKey,
                        [NSNumber numberWithInt:0],kCVPixelBufferExtendedPixelsRightKey,
                        [NSNumber numberWithInt:0],kCVPixelBufferExtendedPixelsTopKey,
                        [NSNumber numberWithInt:0],kCVPixelBufferExtendedPixelsBottomKey,
                        [NSNumber numberWithInt:mVideoWidth],kCVPixelBufferBytesPerRowAlignmentKey,
                        [NSNumber numberWithUnsignedInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange], kCVPixelBufferPixelFormatTypeKey, nil];

AVAssetWriterInput* writerInput = [AVAssetWriterInput assetWriterWithMediaType: AVMediaTypeVideo outputSettings: writerSettings];
// Create an audio input here if you want...
mWriter[writer] = [[AVAssetWriter alloc] initWithURL: [NSURL fileURLWithPath:mOutfile[writer]] fileType: AVFileTypeMPEG4 error:nil];

mPBAdaptor[writer] = [[AVAssetWriterInputPixelBufferAdaptor alloc] initWithAssetWriterInput: writerInput sourcePixelBufferAttributes: pbSettings];

[mWriter[writer] addInput: writerInput]; 
// Add your audio input here if you want it
[p release];
}

第3步:要把这些东西拆掉!

- (void) tearDownWriter: (int) writer 
{
if(mWriter[writer]) {

   if(mWriter[writer].status == 1) [mWriter[writer] finishWriting]; // This will complete the movie.
   [mWriter[writer] release]; mWriter[writer] = nil;
   [mPBAdaptor[writer] release]; mPBAdaptor[writer] = nil;
}

}

第4步:交换!删除当前的编写器并在另一个编写器写入时异步重新创建它。

- (void) swapWriters
{
 NSAutoreleasePool * p = [[NSAutoreleasePool alloc] init];
 if(++mFrameCount > mCurrentTargetFrameCount) 
 { 
    mFrameCount = 0;
    int c, n;
    c = mCurrentWriter^1;
    n = mCurrentWriter;  // swap.

    [self tearDownWriter:n];
    __block VideoCaptureClass* bSelf = self;
    dispatch_async(dispatch_get_global_queue(0,0), ^{
      [bSelf setupWriter:n];
              CMTime time;
    time.value = 0;
    time.timescale = 15; // or whatever the correct timescale for your movie is
    time.epoch = 0;
    time.flags = kCMTimeFlags_Valid;
    [bSelf->mWriter[n] startWriting];
    [bSelf->mWriter[n] startSessionAtSourceTime:time];
    });
    mCurrentWriter = c;
 } 

[p release];
}

注意:启动时,您必须创建并启动两个作家。

第5步:捕获输出

   - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
   // This method will only work with video; you'll have to check for audio if you're using that.
   CMTime time = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); // Note: you may have to create your own PTS.

   CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

   [mPBAdaptor[mCurrentWriter] appendPixelBuffer:pixelBuffer withPresentationTime: time];

   [self swapBuffers];
  }

如果您不需要,可以跳过像素缓冲适配器。这应该可以让您大致了解如何做您想做的事情。 mTargetFrameCount表示您希望当前视频的长度为多少帧。音频可能需要额外考虑,如果您使用音频,可能需要根据音频流而不是视频流来设置长度。