gpt4 book ai didi

ios - 如何让 AVAssetReader 循环?

转载 作者:行者123 更新时间:2023-11-28 15:51:02 39 4
gpt4 key购买 nike

您好,我一直在尝试弄清楚如何在 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/

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