3

まず、ブラッドの GPUImage に関する素晴らしい業績を祝福したいと思います。

特定のビデオ ファイルに回転を適用し、出力として mpeg4 (AVFileTypeMPEG4) ファイルを取得しようとしています。

これを行うと、次のメッセージが表示されます。

* -[AVAssetWriterInput appendSampleBuffer:] outputSettings が nil でない場合、入力バッファは非圧縮形式でなければなりません

この問題は、ファイル タイプを AVFileTypeMPEG4 に設定して GPUImageMovieWriter の次の init メソッドを使用すると発生します。

- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSMutableDictionary *)outputSettings;

ただし、実際にはクイックタイム ムービーを生成する別の init メソッドに対しては機能します (デフォルトでは AVFileTypeQuickTimeMovie が設定されています)。

- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize;

GPUImageWriter で mpeg4 動画ファイルを出力できるようになったら、どなたか教えてください。

多くの調査と試行の後、私が作成したいくつかのコードの 1 つを以下に示します。

movieFile = [[GPUImageMovie alloc] initWithURL:inputUrl];
movieFilter = [[GPUImageBrightnessFilter alloc] init];
[movieFilter setInputRotation:videoRotationMode atIndex:0];
[movieFile addTarget:movieFilter];
unlink([[outputUrl path] UTF8String]); // If a file already exists, AVAssetWriter won't let you record new frames, so delete the old movie

NSMutableDictionary *videoSettings = [[NSMutableDictionary alloc] init];;
[videoSettings setObject:AVVideoCodecH264 forKey:AVVideoCodecKey];
[videoSettings setObject:[NSNumber numberWithInteger:width] forKey:AVVideoWidthKey];
[videoSettings setObject:[NSNumber numberWithInteger:height] forKey:AVVideoHeightKey];



AudioChannelLayout channelLayout;
memset(&channelLayout, 0, sizeof(AudioChannelLayout));
channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo;

NSDictionary *audioSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                [ NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,
                                [ NSNumber numberWithInt: 2 ], AVNumberOfChannelsKey,
                                [ NSNumber numberWithFloat: 16000.0 ], AVSampleRateKey,
                                [ NSData dataWithBytes:&channelLayout length: sizeof( AudioChannelLayout ) ], AVChannelLayoutKey,
                                [ NSNumber numberWithInt: 32000 ], AVEncoderBitRateKey,
                                nil];



// Will create quicktime file
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:outputUrl size:CGSizeMake(640.0, 480.0) fileType:AVFileTypeMPEG4 outputSettings:videoSettings];


[movieFilter addTarget:movieWriter];
// Configure this for video from the movie file, where we want to preserve all video frames and audio samples
movieWriter.shouldPassthroughAudio = NO; // default YES
[movieWriter setHasAudioTrack:TRUE audioSettings:audioSettings];
movieFile.audioEncodingTarget = movieWriter;
[movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter];

[movieWriter setDelegate:self];
[movieWriter startRecording];
[movieFile startProcessing];

前もって感謝します

PS:iOS6を使用しています

4

0 に答える 0