Ios CMVideoFormatDescription从Swift中的264个参数集创建
CoreMedia/Video工具箱API使用了很多指针,这让我很困惑 SPS、PPS数据来自我的h264流,我只是想为它创建一个VFD 我已经尝试了下面的方法,并希望它能够工作,但是我得到了一个-12710错误(kCMFormatDescriptionError\u InvalidParameter=-12710) 这是我的操场。。我做错了什么Ios CMVideoFormatDescription从Swift中的264个参数集创建,ios,swift,video-toolbox,Ios,Swift,Video Toolbox,CoreMedia/Video工具箱API使用了很多指针,这让我很困惑 SPS、PPS数据来自我的h264流,我只是想为它创建一个VFD 我已经尝试了下面的方法,并希望它能够工作,但是我得到了一个-12710错误(kCMFormatDescriptionError\u InvalidParameter=-12710) 这是我的操场。。我做错了什么 // uses CoreMedia Framework import CoreMedia // sps and pps variables var
// uses CoreMedia Framework
import CoreMedia
// sps and pps variables
var spsData: [UInt8] = []
var ppsData: [UInt8] = []
// CMVideoFormatDescriptionCreateFromH264ParameterSets parameters
let parameterSetCount: Int = 2
var parameterSetPointers: UnsafePointer<UnsafePointer<UInt8>> = nil
var parameterSetSizes: UnsafePointer<Int> = nil
let NALUnitHeaderLength: Int32 = 4
var formatDescriptionOut: UnsafeMutablePointer<Unmanaged<CMFormatDescription>?> = nil
// set raw sps and pps data
let rawSPS: [UInt8] = [0x00,0x00,0x00,0x01,0x67,0x64,0x00,0x32,0xAC,0xB4,0x02,0x80,0x2D,0xD2,0xA4,0x00,0x00,0x0F,0xA4,0x00,0x03,0xA9,0x85,0x81,0x00,0x00,0x63,0x2E,0x80,0x01,0x65,0x0E,0xF7,0xBE,0x17,0x84,0x42,0x35]
let rawPPS: [UInt8] = [0x00,0x00,0x00,0x01,0x68,0xEE,0x3C,0xB0]
// extract sps data
spsData = Array(rawSPS[Int(NALUnitHeaderLength)..<rawSPS.count])
// extract pps data
ppsData = Array(rawPPS[Int(NALUnitHeaderLength)..<rawPPS.count])
let dataParamArray = [UnsafePointer<UInt8>(spsData), UnsafePointer<UInt8>(ppsData)]
parameterSetPointers = UnsafePointer(dataParamArray)
let sizeParamArray = [UnsafePointer<Int>(bitPattern: spsData.count), UnsafePointer<Int>(bitPattern: ppsData.count)]
parameterSetSizes = UnsafePointer(sizeParamArray)
// create video format description
let result: OSStatus = CMVideoFormatDescriptionCreateFromH264ParameterSets(kCFAllocatorDefault, parameterSetCount, parameterSetPointers, parameterSetSizes, NALUnitHeaderLength, formatDescriptionOut)
//使用CoreMedia框架
导入CoreMedia
//sps和pps变量
变量spsData:[UInt8]=[]
变量数据:[UInt8]=[]
//CMVideoFormatDescriptionCreatefromH264参数集参数
let参数setcount:Int=2
var参数setpointers:UnsafePointer=nil
变量参数集大小:UnsafePointer=nil
设NALUnitHeaderLength:Int32=4
变量formatDescriptionOut:UnsafemeutablePointer=nil
//设置原始sps和pps数据
让rawsp:[UInt8]=[0x00,0x00,0x00,0x01,0x67,0x64,0x00,0x32,0xAC,0xB4,0x02,0x80,0x2D,0xD2,0xA4,0x00,0x00,0x0F,0xA4,0x00,0x03,0xA9,0x85,0x81,0x00,0x00,0x00,0x63,0x2E,0x80,0x01,0x65,0x0E,0xF7,0xBE,0x17,0x84,0x42,0x35]
设rawPPS:[UInt8]=[0x00,0x00,0x00,0x01,0x68,0xEE,0x3C,0xB0]
//提取sps数据
spsData=Array(rawSPS[Int(NALUnitHeaderLength)…当然有。下面是代码
// get pointer to sps and pops data
let pointerSPS = UnsafePointer<UInt8>(spsData)
let pointerPPS = UnsafePointer<UInt8>(ppsData)
// make pointers array
let dataParamArray = [pointerSPS, pointerPPS]
// set parameter set pointers
_parameterSetPointers = UnsafePointer<UnsafePointer<UInt8>>(dataParamArray)
// make parameter sizes array
let sizeParamArray = [spsData.count, ppsData.count]
// set parameter set sizes
_parameterSetSizes = UnsafePointer<Int>(sizeParamArray)
// create video format description
let result: OSStatus = CMVideoFormatDescriptionCreateFromH264ParameterSets(
kCFAllocatorDefault,
_parameterSetCount,
_parameterSetPointers,
_parameterSetSizes,
_NALUnitHeaderLength,
&_formatDescriptionOut)
//获取指向sps和pops数据的指针
let pointerSPS=UnsafePointer(spsData)
设pointerPPS=UnsafePointer(ppsData)
//生成指针数组
让dataParamArray=[pointerSPS,pointerSPS]
//设置参数集指针
_parameterSetPointers=未安全指针(dataParamArray)
//生成参数大小数组
设SizePararray=[spsData.count,ppsData.count]
//设置参数集大小
_parameterSetSizes=未安全指针(SizePararray)
//创建视频格式描述
let result:OSStatus=cmVideoFormatDescriptionCreatefromh264参数集(
KCO默认值,
_参数setcount,
_参数设置指针,
_参数设置大小,
_NALUnitHeaderLength,
&_格式描述输出)
这是一个基于上述原始代码的工作示例。我必须对@ZENUAV的答案进行额外更改(在代码中注明)才能使其工作。使用Swift 1.2在Xcode 6.4上进行测试
注意:如果h.264 NALU恰好存储在NSData
中,则可以使用字节
属性值代替指针SPS
/指针SPS
//使用CoreMedia框架
导入CoreMedia
//sps和pps变量
变量spsByteArray:[UInt8]=[]
变量ppsbytarray:[UInt8]=[]
//CMVideoFormatDescriptionCreatefromH264参数集参数
let参数setcount:Int=2
var参数setpointers:UnsafePointer=nil
变量参数集大小:UnsafePointer=nil
设NALUnitHeaderLength:Int32=4
//重要更改(另请参见下面的用法):
var formatDescriptionOut=unsafemeutablepointer.alloc(1)
让rawsp:[UInt8]=[0x00,0x00,0x00,0x01,0x67,0x64,0x00,0x32,0xAC,0xB4,0x02,0x80,0x2D,0xD2,0xA4,0x00,0x00,0x0F,0xA4,0x00,0x03,0xA9,0x85,0x81,0x00,0x00,0x00,0x63,0x2E,0x80,0x01,0x65,0x0E,0xF7,0xBE,0x17,0x84,0x42,0x35]
设rawPPS:[UInt8]=[0x00,0x00,0x00,0x01,0x68,0xEE,0x3C,0xB0]
//提取sps数据
spsByteArray=Array(rawSPS[Int(NALUnitHeaderLength)…你有没有发现这个问题?@ZENUAVHey@zenavav,我正在尝试将H.264流格式的DJI转换为MP4文件。我注意到你也遇到过类似的问题(见DJI论坛)。你能转换它吗?你能共享一个工作代码吗?你能把它更新到Swift 5吗?它真的很有用,但我似乎不能使用它,语法错误。非常感谢!:)