- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
感谢您看到这个问题。
我从 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/
我正在尝试控制 GPUImageMovie 的播放。我想要存档的是从一帧跳转到另一帧(来回查找时间,滑动控制),而不是播放视频,但我不明白它的组件是否是为此用途而设计的。 GPUImageMovie
我正在使用 GPUImage 转换电影。 如何在 GPUImageMovie 中将开始时间设置为 15 秒,将结束时间设置为 20 秒? startTime 或 endTime 是不同的。 最佳答案
我正在使用 Brad Larson 的优秀图书馆 GPUImage为我的申请。目前我遇到了一个问题。我的应用程序捕获 10 秒的视频,然后允许应用 filter。在 GPUImageMovie 中应用
我正在尝试使用一些 GPUImagePicture 作为纹理源以及用于过滤播放视频的片段着色器。 我能够以这种方式很好地处理静止图像,但我似乎无法弄清楚我缺少什么才能让它在 GPUImageMovie
我在我的项目中添加了用于视频编辑的 gpuimage 框架,但它无法播放干净的视频(根据屏幕截图)我检查了 gpuimage 框架中的示例,即“SimpleVideoFileFilter”, 但它也有
我正在使用 GPUImage 库来过滤视频(基于文件的输入)。我按照 https://github.com/BradLarson/GPUImage 的指示进行操作.不清楚的是如何跟踪 GPUImage
有没有办法检测 GPUImageMovie 何时完成处理?目前我不想保存电影,所以没有带有完成 block 的 GPUImageMovieWriter。 self.movieFile = [[GPUI
我正在使用正在播放电影文件的 GPUImageMovie,该文件是在 iOS 设备上录制的。 但是,当 GPUImageMovie 播放它时,它的方向错误,因此视频不会旋转以正确显示。 如何让它尊重它
我像这样通过 GPUImage 创建视频效果 self.overlayerView = [[GPUImageView alloc] init]; self.overlayerView.frame =
感谢您看到这个问题。 我从 GPUImageMovieComposition 和 GPUImageWriter 创建了一个电影,有时 (5% ~ 10%) 电影在开头有红框。 请教我为什么会出现这种现
这是我设置播放的方式: movie = GPUImageMovie(url: url) movie.playAtActualSpeed = true movie.delegate = self mov
我是一名优秀的程序员,十分优秀!