Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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
Swift 如何保存Go Pro的原始视频数据?_Swift_Video Streaming_H.264_Mpeg2 Ts_Gopro - Fatal编程技术网

Swift 如何保存Go Pro的原始视频数据?

Swift 如何保存Go Pro的原始视频数据?,swift,video-streaming,h.264,mpeg2-ts,gopro,Swift,Video Streaming,H.264,Mpeg2 Ts,Gopro,我已经注册了Go Pro开发者程序,并设置了摄像头,以便接收原始数据。最终,我希望通过HLS在实时流中提供这些数据 该应用程序当前创建了一个.m3u8文件,并每隔五秒钟将我接收到的数据分块到新的.ts文件中。但是,当我尝试播放此流时,没有播放任何内容,因此我不确信我保存为“ts”的数据的格式是否正确 我推测,每次调用下面的函数时,传递的数据代表一个或多个TS数据包,但这些数据包是否以正确的格式保存 我已经用mediastreamvalidator检查了.m3u8文件的格式,但它没有提供任何关于t

我已经注册了Go Pro开发者程序,并设置了摄像头,以便接收原始数据。最终,我希望通过HLS在实时流中提供这些数据

该应用程序当前创建了一个
.m3u8
文件,并每隔五秒钟将我接收到的数据分块到新的
.ts
文件中。但是,当我尝试播放此流时,没有播放任何内容,因此我不确信我保存为“ts”的数据的格式是否正确

我推测,每次调用下面的函数时,传递的数据代表一个或多个TS数据包,但这些数据包是否以正确的格式保存

我已经用
mediastreamvalidator
检查了
.m3u8文件的格式,但它没有提供任何关于
ts
文件故障的线索


我将文档中的一个示例转换为Swift,并添加了一些我自己的代码,如下所示:

func output(_ output: GPCameraPlayerOutput!, didOutputBuffer bytes: UnsafePointer<UInt8>!, length: Int) {

    // TS packets are always 188 bytes
    for i in stride(from: 0, to: length, by: CameraPreviewViewController.TSPacketSize) {

        /First byte should be the "sync byte"
        if Int(bytes[i]) != CameraPreviewViewController.SyncByte {
            continue //Sync byte expected
        }

        let pid = (Int(bytes[i + 1] & 0x1F)) << 8 | Int(bytes[i + 2]) //read the next 13 bits as an int
        if pid == CameraPreviewViewController.H264 {
            //parse video data
            let packet : UnsafePointer<UInt8> = bytes.advanced(by: i)
            currentTSOutputStream.write(packet, maxLength: CameraPreviewViewController.TSPacketSize)

            [clipped - occasionally save the ts stream and start a new one]

        }
        else if pid == CameraPreviewViewController.ACC {
            //ignore audio data
        }
        else {
            print ("Unknown Data: \(pid)")
        }
    }
}
func输出(输出:GPCameraPlayerOutput!,didOutputBuffer字节:UnsafePointer!,长度:Int){
//TS数据包总是188字节
对于步幅中的i(从:0到:长度,由:CameraPreviewViewController.TSPacketSize){
/第一个字节应为“同步字节”
如果Int(字节[i])!=CameraPreviewViewController.SyncByte{
继续//需要同步字节
}

设pid=(Int(字节[i+1]&0x1F))您能提供一个示例捕获吗?在任何情况下,您都不能只过滤MPEG-TS流中的视频数据包,除了a/V之外,还有其他PID携带有关节目/流的信息。您也不应该随机分割MPEG-TS流。每个片段至少应该有一个IDR帧,最好是在开始时。