3

OSX Lion で AVFoundation を使用してスクリーン キャプチャを行っています。次のように達成されます。

    self->screenInput = [[AVCaptureScreenInput alloc] initWithDisplayID:self->screen];
    self->dataOutput = [[AVCaptureVideoDataOutput alloc] init];
    self->session = [[AVCaptureSession alloc] init];
    self->assetWriter = [[AVAssetWriter alloc] initWithURL:url
                                                  fileType:AVFileTypeQuickTimeMovie 
                                                     error:&error];
    self->writerInput = [[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo
                                                           outputSettings:nil] retain];
    self->dataOutput.videoSettings=videosettings;

- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
       fromConnection:(AVCaptureConnection *)connection
{

    if(!self->startedWriting)
    {
        [self->assetWriter startSessionAtSourceTime:CMSampleBufferGetPresentationTimeStamp(sampleBuffer)];
        self->startedWriting = YES;
    }

    if(self->writerInput.readyForMoreMediaData)
    {
        [self->writerInput appendSampleBuffer:sampleBuffer]
    }

}

これにより、フレームレートはおおよそ 1 Mbps -> 3 Mbps になります。これに関する問題は、指定したビデオ設定で次のことです。

NSMutableDictionary * compressionSettings = [[[NSMutableDictionary alloc] initWithCapacity:1] autorelease];
[compressionSettings setObject:[NSNumber numberWithInt:512000] forKey:AVVideoAverageBitRateKey];
[videosettings setObject:compressionSettings forKey:AVVideoCompressionPropertiesKey];

は 512K 用で、ビットレートが高いとファイルが大きくなりすぎます (結局、これらのファイルをアップロードする必要があります)。

ラインを外すと

    self->dataOutput.videoSettings=videosettings;

代わりに、ビデオ設定をライター入力に適用します

self->writerInput = [[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo
                                                       outputSettings:videosettings] retain];

ビットレートが低すぎます (通常は 100 Kbps => 300 Kbps)。これは、エンコーディングがハードウェアではなくソフトウェアを介して行われているためだと思います (データが から返された後に発生していますAVCaptureSession)。

キャプチャを強制的に 1 ~ 3 Mbps から 512K に下げるにはどうすればよいですか? それがもっと高くなることができるなら、なぜそれが使用しているレートを制限することができないのか想像できません.

ありがとう、

-G

4

1 に答える 1

1

AVCaptureVideoDataOutput videoSettings プロパティのドキュメントから

Currently, the only supported key is kCVPixelBufferPixelFormatTypeKey. Supported pixel formats are
kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, kCVPixelFormatType_420YpCbCr8BiPlanarFullRange and kCVPixelFormatType_32BGRA,
except on iPhone 3G, where the supported pixel formats are kCVPixelFormatType_422YpCbCr8 and kCVPixelFormatType_32BGRA.

このクラスに圧縮設定を設定しても意味がありません。これは、AVAssetWriterInput の圧縮設定が nil であることを意味します。したがって、デバイスのデフォルト レートが取得されます。

OS-X AVFoundaton の実装に間違いなくバグがある可能性がありますが、受信しているビットレートは正しい可能性があります。たとえば、ビデオにはどれくらいの動きがありますか? シーンはどのくらい複雑ですか?また、H264/AVC は固定ビットレート コーデックではないことに注意してください。

于 2011-10-01T02:48:49.023 に答える