gpt4 book ai didi

iphone - 如何在辅助线程上以与在主线程上相同的速率运行 AVAssetReader?

转载 作者:行者123 更新时间:2023-11-29 13:46:02 25 4
gpt4 key购买 nike

我有一个 OpenGL iOS 应用程序,我正在使用 AVAssetReader 从视频中读取帧并使用视频内容为一个简单模型制作纹理。

一切都按预期工作,除了我在辅助线程上使用 AVAssetReader 并在主线程上绑定(bind)纹理。问题是视频逐帧运行非常慢。

有什么方法可以使视频位置与当前时间同步,从而不会出现慢动作?

额外信息

这是我阅读视频的方式(在辅助线程上):

NSAutoreleasePool *pool = [NSAutoreleasePool new];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString* fullPath = [[documentsDirectory stringByAppendingPathComponent:@"sample_video.mp4"] retain];
NSString *urlAddress = fullPath;
NSURL *url = [NSURL fileURLWithPath:urlAddress];
AVURLAsset *urlAsset = [[AVURLAsset alloc] initWithURL:url options:nil];
NSArray *tracks = [urlAsset tracksWithMediaType:AVMediaTypeVideo];
AVAssetTrack *track = [tracks objectAtIndex:0];
NSDictionary* trackDictionary = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA]
forKey:(id)kCVPixelBufferPixelFormatTypeKey];

AVAssetReaderTrackOutput *asset_reader_output = [[AVAssetReaderTrackOutput alloc] initWithTrack:track outputSettings:trackDictionary];

AVAssetReader *asset_reader = [[AVAssetReader alloc] initWithAsset:urlAsset error:nil];
[asset_reader addOutput:asset_reader_output];
[asset_reader startReading];

while (asset_reader.status == AVAssetReaderStatusReading){

CMSampleBufferRef sampleBufferRef = [asset_reader_output copyNextSampleBuffer];

if (sampleBufferRef){
[self performSelectorOnMainThread:@selector(bindNewFrame) withObject:nil waitUntilDone:YES];
}
CMSampleBufferInvalidate(sampleBufferRef);
CFRelease(sampleBufferRef);
}
[pool release];

最佳答案

我通过在另一个函数中移动 while 循环的内容然后使用 NSTimer 以 1.0/track.nominalFrameRate 的速率调用该函数来解决这个问题

关于iphone - 如何在辅助线程上以与在主线程上相同的速率运行 AVAssetReader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7363728/

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