1

これは、私を困惑させたかなり具体的な質問です。ウェブカメラから MP4 にビデオ データをキャプチャするビデオ録画ソフトウェアを作成しています。私のソフトウェアは、QuickTime Player に同じことをさせるが MOV に出力するようにトリガーする、既に配置されているスクリプトを置き換える予定です。

私は AVFoundation を使用しており、キャプチャと保存を適切に行っていますが、微調整とテストを繰り返した後、既に配置されているスクリプトが一貫して、私のソフトウェアよりも高いビデオ品質と小さいファイル サイズで MOV ファイルを作成することがわかりました。

オンサイト スクリプトによって作成された MOV と、私のソフトウェアによって作成された MP4 の 2 つのサンプルへのリンクを次に示します。

MOV は同僚によって作成されたもので、自分のソフトウェアに合わせようとしている品質とファイル サイズです。MP4 は私のオフィスで録音していました。明らかに異なる照明状況でしたが、現場で使用されているのと同じカメラを使用していました。

2 つのビデオを比較すると、サイズ、長さ、ビデオ コーデックは同じですが、ファイル サイズと品質の両方が異なることがわかります。

AVAssetWriter と AVAssetWriter の入力を設定するコードは次のとおりです。

NSDictionary *settings = nil;

settings = [NSDictionary dictionaryWithObjectsAndKeys:
            // Specify H264 (MPEG4) as the codec
            AVVideoCodecH264, AVVideoCodecKey,

            // Specify the video width and height
            [NSNumber numberWithInt:self.recordSize.width], AVVideoWidthKey,
            [NSNumber numberWithInt:self.recordSize.height], AVVideoHeightKey,

            // Specify the video compression
            [NSDictionary dictionaryWithObjectsAndKeys:
             [NSNumber numberWithInteger:2500000], AVVideoAverageBitRateKey,
             [NSNumber numberWithInt:1], AVVideoMaxKeyFrameIntervalKey,
             //AVVideoProfileLevelH264Baseline30, AVVideoProfileLevelKey, Not available on 10.7
              nil], AVVideoCompressionPropertiesKey,

            // Specify the HD output color
            [NSDictionary dictionaryWithObjectsAndKeys:
             AVVideoColorPrimaries_ITU_R_709_2, AVVideoColorPrimariesKey,
             AVVideoTransferFunction_ITU_R_709_2, AVVideoTransferFunctionKey,
             AVVideoYCbCrMatrix_ITU_R_709_2, AVVideoYCbCrMatrixKey, nil], AVVideoColorPropertiesKey,
            nil];

self.assetWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:settings];// sourceFormatHint:self.formatHint];

/*self.pixelBufferAdaptor = [[AVAssetWriterInputPixelBufferAdaptor alloc]
 initWithAssetWriterInput:self.assetWriterInput
 sourcePixelBufferAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
 [NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange],//kCVPixelFormatType_32BGRA],
 kCVPixelBufferPixelFormatTypeKey,
 nil]];*/
NSError *error;

self.videoFile = [NSURL fileURLWithPath:file];

//[self.movieFileOutput startRecordingToOutputFileURL:self.videoFile recordingDelegate:self];

self.assetWriter = [[AVAssetWriter alloc]
                    initWithURL:self.videoFile
                    fileType:AVFileTypeMPEG4//AVFileTypeQuickTimeMovie//
                    error:&error];

if (self.assetWriter){
  [self.assetWriter addInput:self.assetWriterInput];

  self.assetWriterInput.expectsMediaDataInRealTime = YES;

そして、AVCaptureVideoDataOutput をセットアップしてキャプチャ セッションに追加するコード:

AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];

output.alwaysDiscardsLateVideoFrames = NO;

  output.videoSettings = nil;

  self.videoQueue = dispatch_queue_create("ca.blackboxsoftware.avcapturequeue", NULL);

  [output setSampleBufferDelegate:self queue:self.videoQueue];

  [self.session addOutput:output];

この品質の問題は私のソフトウェアの大きな障害であり、あなたの助けがどうしても必要です. あなたが見る必要があるかもしれない他のコードを投稿し、違いを生むと思われる変更をテストしていただければ幸いです.

お時間をいただきありがとうございます。

4

0 に答える 0