使用AVFoundation创建MPEG-2传输流

时间:2012-05-15 23:26:00

标签: avfoundation http-live-streaming avcapturemoviefileoutput

我正在尝试创建格式正确的视频文件,以便在Apple的HTTP直播中使用。以下是创建文件的代码:

// Init the device inputs
AVCaptureDeviceInput *newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:[self backFacingCamera] error:nil];
AVCaptureDeviceInput *newAudioInput = [[AVCaptureDeviceInput alloc] initWithDevice:[self audioDevice] error:nil];

// Create session
AVCaptureSession *newCaptureSession = [[AVCaptureSession alloc] init];
newCaptureSession.sessionPreset = AVCaptureSessionPresetMedium;
self.session = newCaptureSession;

// Add inputs and output to the capture session
if ([newCaptureSession canAddInput:newVideoInput]) {
    [newCaptureSession addInput:newVideoInput];
}
if ([newCaptureSession canAddInput:newAudioInput]) {
    [newCaptureSession addInput:newAudioInput];
}

// Setup the output
AVCaptureMovieFileOutput *aMovieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
if ([self.session canAddOutput:aMovieFileOutput])
    [self.session addOutput:aMovieFileOutput];

aMovieFileOutput.maxRecordedDuration = CMTimeMakeWithSeconds(10.f, 1);

// Begin recording
AVCaptureConnection *videoConnection = [self.captureOutput connectionWithMediaType:AVMediaTypeVideo];
if ([videoConnection isVideoOrientationSupported])
    [videoConnection setVideoOrientation:[self calculateVideoOrientation]];

[aMovieFileOutput startRecordingToOutputFileURL:[self nextOutputURL] recordingDelegate:self];

[self nextOutputURL]返回有效的NSURL,文件已成功保存到磁盘,我可以在VLC和QuickTime中打开并查看该文件。在VLC中查看的视频格式是'avc1',我收集的是the same as H.264。在QuickTime中查看的视频格式是H.264。当然,文件的扩展名是.ts。

看来我正在做的一切正确,但当我尝试使用mediastreamvalidator验证我的HTTP直播流时,我收到以下错误:

http://imac.local.:2020/fileSequence000.ts:
ERROR: (-12971) failed to parse segment as either an MPEG-2 TS or an ES

任何人都知道我可能做错了什么?

1 个答案:

答案 0 :(得分:3)

给定的代码不生成MPEG-2传输流,而是生成标准的MPEG-4文件,但扩展名为.ts。 VLC和QuickTime都会识别文件并能够播放它,但是mediastreamvalidator正确地指出它不是MPEG-2 TS。检查生成的文件是否为MPEG-2 TS的快速方法是查看第一个字节。如果它不是0x47,那么它将不是MPEG-2 TS。