4

この質問をご覧いただきありがとうございます。

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 は避けましたcurrentSampleTimecurrentSampleTime.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];
       }
   }
4

2 に答える 2

1

この問題から私を救ったこれまでに見つけた唯一の解決策は、コミット e98cc813b に戻ることです。git bisectを使用して、同じビデオで一連の処理テストを実行することで解決しました。このコミットには、私のプロジェクトに必要なすべての機能が既に含まれており、より安定させるために必要な変更はわずかでした。ここで変更を確認できます: https://github.com/crazyjooe/GPUImage

また、テストを重ねた結果、特にキャンセルに関しては、処理自体が非常に安定したと言えます。すべての変更が導入された後、ビデオ処理の信頼性と安定性がどのように低下​​したのだろうか。

于 2014-05-14T19:21:57.693 に答える