【问题标题】:How to get started with Video-To-Texture rendering?如何开始使用 Video-To-Texture 渲染?
【发布时间】:2019-11-06 15:19:19
【问题描述】:

我有一个视频被下载并检索为NSData*(稍后将是NSInputStream*)。

文件格式现在无关紧要。 我想通过 MTLTexture(或视频的等效对应物)将此视频渲染到 3D 对象上。

我不知道从哪里开始,因为在 AVFoundation 框架 以及 CoreGraphics 框架 中似乎有无穷无尽的类变化。你能帮我看看我需要使用的相关类吗?

【问题讨论】:

  • 实现这一点的关键类是CVMetalTextureCache,它允许您有效地从CVPixelBuffers(很容易从AVPlayerItemVideoOutput和各种其他类型获得)转换为MTLTextures .从那里开始,只需绑定生成的纹理并进行渲染。由于这方面的各个方面都有很多在线资源,因此您应该考虑研究这些资源并在遇到困难时提出更窄的问题。

标签: ios objective-c metal


【解决方案1】:

感谢@warrenm,我找到了正确的解决方案。
这是我的VideoPlayer 课程的一部分

-(instancetype)initWithURL:(NSURL*)url {
        self = [super init];
        if (self) {
            CVMetalTextureCacheCreate(kCFAllocatorDefault, nil, [[Renderer sharedInstance] renderDevice], nil, &self->_textureCache);
            NSError* error1;
            NSString* mimeType = @"video/mp4";
            NSArray* keys = @[@"tracks"];
            AVAsset* videoAsset = [[AVURLAsset alloc] initWithURL:url options:@{@"AVURLAssetOutOfBandMIMETypeKey" : mimeType}];
            [videoAsset loadValuesAsynchronouslyForKeys:keys completionHandler:^{
               [self onVideoLoaded:videoAsset];
            }
        ];
    }
    return self;
}


-(void)onVideoLoaded:(AVAsset*)videoAsset {
    NSError* error;
    AVKeyValueStatus status = [videoAsset statusOfValueForKey:@"tracks" error:&error];
    switch (status) {
        //error handlings
    }
    NSDictionary* settings = @{(id) kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA)};
    [self setVideoPlayerOutput:[[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:settings]];
    [self setVideoPlayerItem:[AVPlayerItem playerItemWithAsset:videoAsset]];
    [[self videoPlayerItem] addOutput:[self videoPlayerOutput]];
    [self setVideoPlayer:[[AVPlayer alloc] initWithPlayerItem:[self videoPlayerItem]]];
    [[self videoPlayer] setVolume:1.0f];
    [self setIsLoaded:YES];
}

要获得纹理,我有这个功能:

-(id <MTLTexture>)getCurrentFrameTexture {
    CVPixelBufferRef buffer = [[self videoPlayerOutput] copyPixelBufferForItemTime:[[self videoPlayerItem] currentTime] itemTimeForDisplay:nil];
    NSUInteger width = CVPixelBufferGetWidth(buffer);
    NSUInteger height = CVPixelBufferGetHeight(buffer);
    NSUInteger planeCount = CVPixelBufferGetPlaneCount(buffer);
    CVMetalTextureRef textureRef;
    CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, [self textureCache], buffer, nil, MTLPixelFormatBGRA8Unorm_sRGB, width, height, planeCount, &textureRef);
    id <MTLTexture> tex = CVMetalTextureGetTexture(textureRef);
    CVBufferRelease(textureRef);
    CVBufferRelease(buffer);
    return tex;
}

这也适用于流媒体,只需提供有效的 mp4 网址。该文件未下载或任何东西

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    相关资源
    最近更新 更多