まず、ブラッドの 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を使用しています