この質問をご覧いただきありがとうございます。
GPUImageMovieComposition と GPUImageWriter からムービーを作成すると、(5% ~ 10%) ムービーの最初に赤いフレームが表示されることがあります。
この現象が発生する理由を教えてください。
サンプルのファイルタイプとして AVFileTypeMPEG4 を使用していますが、AVFileTypeQuickTimeMovie も同じです。
_movieFile = [[GPUImageMovieComposition alloc] initWithComposition:composition andVideoComposition:videoComposition andAudioMix:nil];
_movieFile.playAtActualSpeed = YES;
_movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:processedMovieURL
size:CGSizeMake(1280.0, 720.0)
fileType:AVFileTypeMPEG4
outputSettings:videoSetting];
_movieWriter.shouldPassthroughAudio = NO;
[_movieWriter setVideoInputReadyCallback:nil];
[_movieWriter setHasAudioTrack:YES audioSettings:audioSetting];
[_movieFile addTarget:_movieWriter];
_movieFile.audioEncodingTarget = _movieWriter;
[_movieFile enableSynchronizedEncodingUsingMovieWriter:_movieWriter];
[_movieWriter startRecording];
[_movieFile startProcessing];
解決
最後に、解決する方法を見つけることができました...しかし、完璧な方法ではありません...
少しずつ改造
- (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)currentSampleTime
しました。GPUImageMovie.m
が設定されているときcurrentSampleTime
は、赤枠がすべてあるので、設定時currentSampleTime.value == 0
は避けましたcurrentSampleTime
currentSampleTime.value == 0
私が実際に使ったコードをいくつか紹介します。
for (id<GPUImageInput> currentTarget in targets)
{
NSInteger indexOfObject = [targets indexOfObject:currentTarget];
NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue];
if(currentSampleTime.value != 0){
[currentTarget newFrameReadyAtTime:currentSampleTime atIndex:targetTextureIndex];
}
}