Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CMVideoFormatDescription从Swift中的264个参数集创建_Ios_Swift_Video Toolbox - Fatal编程技术网

Ios CMVideoFormatDescription从Swift中的264个参数集创建

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

CoreMedia/Video工具箱API使用了很多指针,这让我很困惑

SPS、PPS数据来自我的h264流,我只是想为它创建一个VFD

我已经尝试了下面的方法,并希望它能够工作,但是我得到了一个-12710错误(kCMFormatDescriptionError\u InvalidParameter=-12710)

这是我的操场。。我做错了什么

// 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吗?它真的很有用,但我似乎不能使用它,语法错误。非常感谢!:)