ios - 如何让 AVAssetReader 循环?

标签 ios swift loops video avfoundation

您好,我一直在尝试弄清楚如何在 GPUImage2 中实现电影循环,但到目前为止还没有成功。 GPUImage2 中的 MovieInput 类使用 AVAssetReader 播放电影文件,所以我研究了循环 AVAssetReader 的方法。我在处理这个主题的 StackOverFlow 上发现了这个问题。 AVFoundation to reproduce a video loop

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

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

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

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

最佳答案

我找到了答案,以防有人疑惑。

    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()
                }
            }
        })
    })
}

关于ios - 如何让 AVAssetReader 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42309905/

相关文章:

iphone - AudioStreamer 和 AVAudioRecorder 不能一起工作

ios - 如何在 Swift 中创建弱引用字典?

ios - 在 UICollectionView 中滚动时 Admob Native Expess Ads 阻塞

带有 Optionals 的 Swift If 语句(来自计算器 Stanford/Youtube)

Java 程序计算平均值。如何显示最高平均值?

ios - 对图像的 @3x 指定感到困惑

ios - 整个程序中的变量名更改

php - 使用多个嵌套循环的最佳方式

r - 无法在循环中绘制多个图?

ios - xcode 5 中的代码签名错误配置文件