gpt4 book ai didi

objective-c - 来自 GPUImageMovie 的视频开头有红框

转载 作者:搜寻专家 更新时间:2023-10-30 19:43:51 24 4
gpt4 key购买 nike

感谢您看到这个问题。

我从 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.value == 0

时设置 currentSampleTime

这是我实际使用的一些代码。

 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];
}
}

最佳答案

在我的例子中,GPUImageMovieWriter 录制的视频开头没有红色,只有空白帧

问题是音频样本出现得比视频帧早,而 assetWriter session 更早开始,然后第一个视频帧可用。

我已经通过替换此代码修改 processAudioBuffer 函数来解决此问题

if (CMTIME_IS_INVALID(startTime))
{
runSynchronouslyOnContextQueue(_movieWriterContext, ^{
if ((audioInputReadyCallback == NULL) && (assetWriter.status != AVAssetWriterStatusWriting))
{
[assetWriter startWriting];
}
[assetWriter startSessionAtSourceTime:currentSampleTime];
startTime = currentSampleTime;
});
}

关于这个

if (CMTIME_IS_INVALID(startTime))
{
NSLog(@"0: Had to drop an audio frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, currentSampleTime)));
if (_shouldInvalidateAudioSampleWhenDone)
{
CMSampleBufferInvalidate(audioBuffer);
}
CFRelease(audioBuffer);
return;
}

此修复适用于 2014 年 5 月 27 日至 7 月 1 日的最新版本的 GPUImage。

关于objective-c - 来自 GPUImageMovie 的视频开头有红框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23235267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com