これは、私を困惑させたかなり具体的な質問です。ウェブカメラから 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];
この品質の問題は私のソフトウェアの大きな障害であり、あなたの助けがどうしても必要です. あなたが見る必要があるかもしれない他のコードを投稿し、違いを生むと思われる変更をテストしていただければ幸いです.
お時間をいただきありがとうございます。