【发布时间】:2019-08-12 15:30:19
【问题描述】:
我得到了一个解码的 AVFrame,其格式显示为 160/Videotoolbox_vld。在google了一些文章(here)并查看了FFmpeg源代码(here和here)后,CVBuffer句柄应该是AVFrame.data[3]。但我得到的CVBuffer 似乎无效,任何CVPixelBufferGetXXX() 函数都返回0 或nil。
如果我像 ffmpeg 的 example/hw_decode.c 那样使用 av_hwframe_transfer_data(),则可以将样本从硬件下载到软件缓冲区。它的AVFrame.format 将是nv12。通过sws_scale 转换为bgra 后,样本可以正确显示在视图中。
我认为 VideoToolbox 解码帧没问题。我将AVFrame.data[3] 转换为CVBuffer 的方式可能是错误的。刚刚学会了快速访问 c 指针,但我不确定如何正确读取指针中的资源句柄(CVBuffer)。
以下是我尝试从 AVFrame 中提取 CVBuffer 的方法
var pFrameOpt: UnsafeMutablePointer<AVFrame>? = av_frame_alloc()
avcodec_receive_frame(..., pFrameOpt)
let data3: UnsafeMutablePointer<UInt8>? = pFrameOpt?.pointee.data.3
data3?.withMemoryRebound(to: CVBuffer.self, capacity: 1) { pCvBuf in
let fW = pFrameOpt!.pointee.width // print 3840
let fH = pFrameOpt!.pointee.height // print 2160
let fFmt = pFrameOpt!.pointee.format // print 160
let cvBuf: CVBuffer = pCvBuf.pointee
let a1 = CVPixelBufferGetDataSize(cvBuf) // print 0
let a2 = CVPixelBufferGetPixelFormatType(cvBuf) // print 0
let a3 = CVPixelBufferGetWidth(cvBuf) // print 0
let a4 = CVPixelBufferGetHeight(cvBuf) // print 0
let a5 = CVPixelBufferGetBytesPerRow(cvBuf) // print 0
let a6 = CVPixelBufferGetBytesPerRowOfPlane(cvBuf, 0) // print 0
let a7 = CVPixelBufferGetWidthOfPlane(cvBuf, 0) // print 0
let a8 = CVPixelBufferGetHeightOfPlane(cvBuf, 0) // print 0
let a9 = CVPixelBufferGetPlaneCount(cvBuf) // print 0
let a10 = CVPixelBufferIsPlanar(cvBuf) // print false
let a11 = CVPixelBufferGetIOSurface(cvBuf) // print nil
let a12 = CVPixelBufferGetBaseAddress(cvBuf) // print nil
let a13 = CVPixelBufferGetBaseAddressOfPlane(cvBuf, 0) // print nil
let b1 = CVImageBufferGetCleanRect(cvBuf) // print 0, 0, 0, 0
let b2 = CVImageBufferGetColorSpace(cvBuf) // print nil
let b3 = CVImageBufferGetDisplaySize(cvBuf) // print 0, 0, 0, 0
let b4 = CVImageBufferGetEncodedSize(cvBuf) // print 0, 0, 0, 0
let b5 = CVImageBufferIsFlipped(cvBuf) // print false
// bad exec
var cvTextureOut: CVMetalTexture?
CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, ..., cvBuf, nil, .bgra8Unorm, 3840, 2160, 0, ...)
}
【问题讨论】:
标签: swift ffmpeg video-toolbox