5

AVFoundationを使用してOSX10.8でスクリーンレコーディングを行っています。sessionPreset「AVCaptureSessionPresetPhoto」を使用して画面全体を記録しています。変更したいのは、作成されるムービーファイルの品質です。

AVCaptureSessionPresetPhotoは、クリッピングなしで実際に全画面をキャプチャするために必要なようです。

ここのドキュメントによると:http://developer.apple.com/library/mac/#documentation/AVFoundation/Reference/AVCaptureSession_Class/Reference/Reference.html

"You use this property to customize the quality level or bitrate of the output. For possible values of sessionPreset, see “Video Input Presets.” The default value is AVCaptureSessionPresetHigh."

ただし、ビデオ入力プリセットの場合、オプションは次の定数のみです。http: //developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVCaptureSession_Class/Reference/Reference.html#//apple_ref/occ/cl / AVCaptureSession

NSString *const AVCaptureSessionPresetPhoto;

NSString *const AVCaptureSessionPresetHigh;

NSString *const AVCaptureSessionPresetMedium;

NSString *const AVCaptureSessionPresetLow;

NSString *const AVCaptureSessionPreset320x240;

NSString *const AVCaptureSessionPreset352x288;

NSString *const AVCaptureSessionPreset640x480;

NSString *const AVCaptureSessionPreset960x540;

NSString *const AVCaptureSessionPreset1280x720;

AVCaptureSessionPresetPhotoは、クリッピングなしで全画面をキャプチャする作業を行いますが、最終的な品質はやや圧倒的です。デフォルトで使用されるビットレートが低いため、目に見えるアーティファクトがあります。

最終録音のビットレートを上げるにはどうすればよいですか?

以下は私の現在のコードのサンプルです。

    mSession = [[AVCaptureSession alloc] init];

    mSession.sessionPreset = AVCaptureSessionPresetPhoto;

    CGDirectDisplayID displayId = kCGDirectMainDisplay;

    AVCaptureScreenInput *input = [[AVCaptureScreenInput alloc] initWithDisplayID:displayId];
    if (!input) {
        mSession = nil;
        return;
    }        

    if ([mSession canAddInput:input]){
        [mSession addInput:input];
    }

    mMovieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
    if ([mSession canAddOutput:mMovieFileOutput])
        [mSession addOutput:mMovieFileOutput];

    [mSession startRunning];

    if ([[NSFileManager defaultManager] fileExistsAtPath:[destPath path]])
    {
        NSError *err;
        if (![[NSFileManager defaultManager] removeItemAtPath:[destPath path] error:&err])
        {
            NSLog(@"Error deleting existing movie %@",[err localizedDescription]);
        }
    }

    [mMovieFileOutput startRecordingToOutputFileURL:destPath recordingDelegate:self];

    mTimer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(finishRecord:) userInfo:nil repeats:NO];
4

2 に答える 2

6

MP4 / MOV H.264ビットストリームのビットレートを細かく制御する必要がある場合は、AVFoundationのAVAssetWriterを使用する必要があります。ビデオ入力の場合、この投稿のようにプロパティを設定します。AVVideoAverageBitRateKeyを見てください。AVVideoMaxKeyFrameIntervalKeyキーにも注意してください。ビデオのポストプロダクションを計画している場合は、キーフレーム間隔に1を使用することをお勧めします。AVAssetWriterの使用例については、AppleのRosyWriterまたはAVCamDemoサンプルアプリケーションを確認してください。さらに説明が必要な場合はお知らせください。

于 2012-08-23T22:04:26.310 に答える
1

これは、実際にはAVAssetWriterを使用せずに実行できます。ここにいくつかのサンプルコードがあります。

for connection in movieFileOutput.connections {
     let settings = movieFileOutput.outputSettings(for: connection)
     var newSettings = settings
     var sub = newSettings[AVVideoCompressionPropertiesKey] as? [String: Any]
     sub![AVVideoAverageBitRateKey] = NSNumber(integerLiteral: 4000000)
     newSettings[AVVideoCompressionPropertiesKey] = sub!
     movieFileOutput.setOutputSettings(newSettings, for: connection)
  }

もちろん、AVCaptureConnectionがビデオ接続であることを確認する必要があります。(私のサンプルコードとは異なり、オプションも安全にアンラップする必要があります)

于 2021-01-29T16:17:13.970 に答える