AVPlayer和AVAssetReader在奇数宽度的ProRes422视频中产生了伪影。
创始人
2024-11-13 02:30:45
0

在处理奇数宽度的ProRes422视频时,AVPlayer和AVAssetReader可能会产生伪影。这是因为ProRes422视频要求宽度为偶数,而当输入奇数宽度的视频时,这些库会在渲染或解码过程中产生问题。

解决这个问题的一种方法是在渲染或解码之前,将奇数宽度的视频进行处理,将其宽度调整为偶数。这可以通过裁剪奇数列或在视频末尾添加一个黑色像素来实现。

以下是一个示例代码,展示了如何使用AVPlayer和AVAssetReader来处理奇数宽度的ProRes422视频并避免伪影:

import AVFoundation

func processProResVideo(url: URL) {
    // 创建AVAsset对象
    let asset = AVAsset(url: url)
    
    // 创建AVAssetTrack对象
    guard let videoTrack = asset.tracks(withMediaType: .video).first else {
        print("Video track not found.")
        return
    }
    
    // 检查视频宽度是否为奇数
    if Int(videoTrack.naturalSize.width) % 2 != 0 {
        // 获取视频的原始尺寸
        let originalSize = videoTrack.naturalSize
        
        // 裁剪奇数列或在视频末尾添加一个黑色像素来将宽度调整为偶数
        let adjustedSize = CGSize(width: ceil(originalSize.width / 2) * 2, height: originalSize.height)
        
        // 创建视频轨道的输出设置
        let outputSettings = [
            kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA
        ]
        
        // 创建AVAssetReaderTrackOutput对象
        let output = AVAssetReaderTrackOutput(track: videoTrack, outputSettings: outputSettings)
        
        // 创建AVAssetReader对象
        guard let reader = try? AVAssetReader(asset: asset) else {
            print("Failed to create AVAssetReader.")
            return
        }
        
        // 添加输出到AVAssetReader对象
        reader.add(output)
        
        // 开始读取
        reader.startReading()
        
        // 处理每个采样缓冲区
        while let sampleBuffer = output.copyNextSampleBuffer() {
            // 获取图像像素缓冲区
            guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
                continue
            }
            
            // 创建一个新的像素缓冲区
            var newPixelBuffer: CVPixelBuffer?
            let status = CVPixelBufferCreate(kCFAllocatorDefault, Int(adjustedSize.width), Int(adjustedSize.height), kCVPixelFormatType_32BGRA, nil, &newPixelBuffer)
            
            if status == kCVReturnSuccess {
                // 将原始像素缓冲区复制到新的像素缓冲区中
                CVPixelBufferLockBaseAddress(imageBuffer, .readOnly)
                CVPixelBufferLockBaseAddress(newPixelBuffer!, [])
                
                let srcBaseAddress = CVPixelBufferGetBaseAddress(imageBuffer)
                let dstBaseAddress = CVPixelBufferGetBaseAddress(newPixelBuffer!)
                
                memcpy(dstBaseAddress, srcBaseAddress, CVPixelBufferGetDataSize(imageBuffer))
                
                CVPixelBufferUnlockBaseAddress(imageBuffer, .readOnly)
                CVPixelBufferUnlockBaseAddress(newPixelBuffer!, [])
                
                // 使用新的像素缓冲区创建一个新的采样缓冲区
                var newSampleBuffer: CMSampleBuffer?
                let timingInfo = CMSampleTimingInfo(duration: CMSampleBufferGetDuration(sampleBuffer), presentationTimeStamp: CMSampleBufferGetPresentationTimeStamp(sampleBuffer), decodeTimeStamp: CMSampleBufferGetDecodeTimeStamp(sampleBuffer))
                
                CMSampleBufferCreateCopyWithNewTiming(allocator: kCFAllocatorDefault, sampleBuffer: sampleBuffer, sampleTimingEntryCount: 1, sampleTimingArray: [timingInfo], sampleBufferOut: &newSampleBuffer)
                
                if let newSampleBuffer = newSampleBuffer {
                    // 更新新的采样缓冲区的图像像素缓冲区
                    CMSampleBufferSetDataBufferFromAudioBufferList(newSampleBuffer, kCFAllocatorDefault, kCFAllocatorDefault, 

相关内容

热门资讯

透视挂透视!拱趴大菠萝辅助神器... 透视挂透视!拱趴大菠萝辅助神器(透视)果然真的是有辅助插件(有挂方略)-哔哩哔哩拱趴大菠萝辅助神器辅...
透视ai!wejoker私人辅... 透视ai!wejoker私人辅助软件(透视)切实真的是有辅助安装(新版有挂)-哔哩哔哩1、实时wej...
透视脚本!德州hhpoker是... 透视脚本!德州hhpoker是真的吗(透视)好像有辅助工具(有挂技巧)-哔哩哔哩1、实时德州hhpo...
推出新举措!wepokerpl... 推出新举措!wepokerplus开挂(透视)好像是有辅助神器(确实有挂)-哔哩哔哩wepokerp...
做出回应!we-poker正规... 做出回应!we-poker正规吗(透视)本来存在有辅助修改器(有人有挂)-哔哩哔哩1、进入游戏-大厅...
透视黑科技!hh poker辅... 透视黑科技!hh poker辅助器先试用(透视)总是真的有辅助神器(确实有挂)-哔哩哔哩1、hh p...
截至发稿!智星德州插件最新版本... 截至发稿!智星德州插件最新版本更新内容详解(透视)其实存在有辅助软件(果真有挂)-哔哩哔哩一、智星德...
随着!wepoker透视最简单... 随着!wepoker透视最简单三个步骤(透视)本来有辅助修改器(确实有挂)-哔哩哔哩1、玩家可以在w...
截至发稿!pokemomo辅助... 截至发稿!pokemomo辅助工具(透视)好像真的是有辅助平台(有挂技巧)-哔哩哔哩1)pokemo...
这一问题亟待解决!拱趴大菠萝挂... 这一问题亟待解决!拱趴大菠萝挂(透视)确实真的是有辅助app(有挂分享)-哔哩哔哩小薇(辅助器软件下...