Swift 如何保存Go Pro的原始视频数据?
我已经注册了Go Pro开发者程序,并设置了摄像头,以便接收原始数据。最终,我希望通过HLS在实时流中提供这些数据 该应用程序当前创建了一个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
.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帧,最好是在开始时。