如何从iOS设备(而不是从自己的相机)流式传输(RTMP)视频

时间:2016-11-16 10:37:52

标签: ios streaming rtmp videocore

我想从iOS设备发送外部视频。 此视频是通过实时流式传输接收的: RTSP服务器 HLS网址(不是来自iPhone相机)。

目前,我可以使用VideoCore(内部使用CameraSourceMicSource)从 iPhone 流式传输我的相机视频,但现在,我要传输的视频来了来自一个URL。与Periscope streaming video from GoPro Cam类似。

问题1:我不知道如何从RTSP网址中提取音频和视频

问题2:我不知道如何从此提取的视频和音频中创建CameraSource o MicSource

您知道在哪里找到一个例子,还是可以帮我解决这个技术挑战?

1 个答案:

答案 0 :(得分:1)

我找到了第一个问题的第一个方法:

  AVPlayerItem *item = [AVPlayerItem playerItemWithURL:URL];
    AVAsset *asset = [item asset];

    [asset loadValuesAsynchronouslyForKeys:@[@"tracks"] completionHandler:^{
        if ([asset statusOfValueForKey:@"tracks" error:nil] == AVKeyValueStatusLoaded) {
            NSArray *videoTracks = [asset tracksWithMediaType:AVMediaTypeVideo];
            NSArray *audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio];

            //VIDEO
            //videoOutput is a AVPlayerItemVideoOutput * property
            [item addOutput:self.videoOutput];

            //AUDIO
            AVMutableAudioMixInputParameters *inputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:[audioTracks objectAtIndex:0]];
            MTAudioProcessingTapCallbacks callbacks;            
            callbacks.version = kMTAudioProcessingTapCallbacksVersion_0;
            callbacks.clientInfo = (__bridge void *)self,
            callbacks.init = tap_InitCallback;
            callbacks.finalize = tap_FinalizeCallback;
            callbacks.prepare = tap_PrepareCallback;
            callbacks.unprepare = tap_UnprepareCallback;
            callbacks.process = tap_ProcessCallback;            
            MTAudioProcessingTapRef tap;
            OSStatus err = MTAudioProcessingTapCreate(kCFAllocatorDefault, &callbacks,
                                                      kMTAudioProcessingTapCreationFlag_PostEffects, &tap);           
            inputParams.audioTapProcessor = tap;
            AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
            audioMix.inputParameters = @[inputParams];
            item.audioMix = audioMix;    
    }];

然后使用CADisplayLink创建一个回调,它将在每个vsync上回调displayPixelBuffer

 self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkCallback:)];
    [[self displayLink] addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [[self displayLink] setPaused:YES];

并在此方法中获取pixelBuffer并发送到输出 对于音频,请使用AURenderCallbackStruct在准备回调中执行类似的任务。