I am trying to decode Prores RAW video file to native bayer representation. But it doesn't work. I always got
Optional(Error Domain=AVFoundationErrorDomain Code=-11821 "Cannot Decode" UserInfo={NSLocalizedFailureReason=The media data could not be decoded. It may be damaged., NSLocalizedDescription=Cannot Decode, NSUnderlyingError=0x600002a982a0 {Error Domain=NSOSStatusErrorDomain Code=-12137 "(null)"}})
I have tried all possible bayer formats:
- kCVPixelFormatType_14Bayer_GRBG
- kCVPixelFormatType_14Bayer_RGGB
- kCVPixelFormatType_14Bayer_BGGR
- kCVPixelFormatType_14Bayer_GBRG
- kCVPixelFormatType_16VersatileBayer
- kCVPixelFormatType_64RGBA_DownscaledProResRAW
but same error. Here a full decoder:
class Decoder {
private let assetReader: AVAssetReader?
private let output: AVAssetReaderTrackOutput
init() throws {
VTRegisterProfessionalVideoWorkflowVideoDecoders()
VTRegisterProfessionalVideoWorkflowVideoEncoders()
let movieUrl = URL(fileURLWithPath: "/Users/xxxx/ProresRAW_Video.MOV")
let movieAsset = AVAsset(url: movieUrl)
do {
let assetReader = try AVAssetReader(asset: movieAsset)
let tracks = movieAsset.tracks(withMediaType: .video)
guard let firstTrack = tracks.first else {
print("No video tracks found")
throw NSError()
}
let outputSettings: [String: Any] = [kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_16VersatileBayer]
let out = AVAssetReaderTrackOutput(track: firstTrack, outputSettings: outputSettings)
out.alwaysCopiesSampleData = true
assetReader.add(out)
self.assetReader = assetReader
self.output = out
} catch {
print(error)
throw error
}
}
func run(){
guard let assetReader = assetReader, assetReader.startReading() else {
print("Failed to stard asset reader")
return
}
while(assetReader.status == .reading) {
guard let sampleBuffer = output.copyNextSampleBuffer() else {
print(assetReader.status.rawValue)
print(assetReader.error)
continue
}
print("Decoding success!")
}
}
}