首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让AVAssetReader循环?

如何让AVAssetReader循环?
EN

Stack Overflow用户
提问于 2017-02-18 09:02:25
回答 1查看 1.5K关注 0票数 0

嗨,我一直在试图弄清楚如何在GPUImage2中实现电影循环,但到目前为止还没有成功。GPUImage2中的MovieInput类使用AVAssetReader播放电影文件,因此我研究了循环AVAssetReader的方法。我在StackOverFlow上找到了这个关于这个话题的问题。AVFoundation to reproduce a video loop

最好的答案是"AVAssetReader不支持查找或重新启动,它本质上是一个顺序解码器。你必须创建一个新的AVAssetReader对象来再次读取相同的样本。“

我试图弄清楚如何将旧的assetReader连接到新的,但我并不是很成功,它每次都崩溃了。

有人建议我尝试这样做,但我不太确定如何编写函数generateAssetReader。

代码语言:javascript
复制
public func start() {
    self.assetReader = generateAssetReader(asset: asset, readAudio: readAudio, videoOutputSettings: videoOutputSettings, audioOutputSettings: audioOutputSettings)

 asset.loadValuesAsynchronously(forKeys:["tracks"], completionHandler:{
            DispatchQueue.global(priority:DispatchQueue.GlobalQueuePriority.default).async(execute: {
                guard (self.asset.statusOfValue(forKey: "tracks", error:nil) == .loaded) else { return }

                guard self.assetReader.startReading() else {
                    print("Couldn't start reading")
                    return
                }

                var readerVideoTrackOutput:AVAssetReaderOutput? = nil;

                for output in self.assetReader.outputs {
                    if(output.mediaType == AVMediaTypeVideo) {
                        readerVideoTrackOutput = output;
                    }
                }

                while (self.assetReader.status == .reading) {
                    self.readNextVideoFrame(from:readerVideoTrackOutput!)
                }


    if assetReader.status == .completed {
        assetReader.cancelReading()
        self.assetReader = nil
        if self.loop {
            self.start()
        } else {
            self.endProcessing()
        }
    }
}

有没有人有办法解决这个循环问题?这是指向MovieInput类的完整代码的链接。https://github.com/BradLarson/GPUImage2/blob/master/framework/Source/iOS/MovieInput.swift

EN

回答 1

Stack Overflow用户

发布于 2017-03-24 03:52:28

我找到了答案,以防有人想知道。

代码语言:javascript
复制
    public func createReader() -> AVAssetReader
{
    var assetRead:AVAssetReader!
    do{
        assetRead = try AVAssetReader.init(asset: self.asset)

        let outputSettings:[String:AnyObject] = [(kCVPixelBufferPixelFormatTypeKey as String):NSNumber(value:Int32(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange))]
        let readerVideoTrackOutput = AVAssetReaderTrackOutput(track:self.asset.tracks(withMediaType: AVMediaTypeVideo)[0], outputSettings:outputSettings)
        readerVideoTrackOutput.alwaysCopiesSampleData = false

        assetRead.add(readerVideoTrackOutput)
    }catch{

    }

    return assetRead
}

public func start() {
    self.assetReader = createReader()
    asset.loadValuesAsynchronously(forKeys:["tracks"], completionHandler:{
        DispatchQueue.global(priority:DispatchQueue.GlobalQueuePriority.default).async(execute: {
            guard (self.asset.statusOfValue(forKey: "tracks", error:nil) == .loaded) else { return }

            guard self.assetReader.startReading() else {
                print("Couldn't start reading")
                return
            }

            var readerVideoTrackOutput:AVAssetReaderOutput? = nil;

            for output in self.assetReader.outputs {
                if(output.mediaType == AVMediaTypeVideo) {
                    readerVideoTrackOutput = output;
                }
            }

            while (self.assetReader.status == .reading) {
                self.readNextVideoFrame(from:readerVideoTrackOutput!)
            }

            if (self.assetReader.status == .completed) {
                self.assetReader.cancelReading()

                if (self.loop) {
                    // TODO: Restart movie processing
                    self.start()
                } else {
                    self.endProcessing()
                }
            }
        })
    })
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42309905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档