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

Posted

技术标签:

【中文标题】如何从 iOS 设备(而不是自己的相机)流式传输 (RTMP) 视频【英文标题】:How to stream (RTMP) video from iOS Device (not from its own camera) 【发布时间】:2016-11-16 10:37:51 【问题描述】:

我想从我的 ios 设备发送外部视频。 此视频是从实时流媒体接收的:RTSP 服务器HLS url(不是来自 iPhone 摄像头)。

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

问题一:我不知道如何从一个RTSP URL中提取音视频

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

您知道在哪里可以找到示例吗?或者您能帮我解决这个技术难题吗?

【问题讨论】:

【参考方案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 创建一个回调,它将在每次垂直同步时回调displayPixelBuffer

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

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

【讨论】:

嘿@Bisca,你也有详细的代码如何建立RTMP连接吗?我正在尝试通过 Assets 视频在 Facebook 上生活。 @AJit 我没有示例...您可以尝试使用 VideoCore (github.com/jgh-/VideoCore-Inactive) 或 lf (github.com/shogo4405/HaishinKit.swift) 或其他实现来执行此操作并将此像素缓冲区用作源 感谢@Bisca 的快速重播,我已经实现了 VideoCore,但它仅支持 CameraSource atm,我不太擅长 C++ 编程来调整源,所以如果你能以某种方式在这里提供帮助?这是我的参考:github.com/kciter/FBLiveAPISample-iOS

以上是关于如何从 iOS 设备(而不是自己的相机)流式传输 (RTMP) 视频的主要内容,如果未能解决你的问题,请参考以下文章

将视频从 Android 相机流式传输到服务器 [关闭]

如何使用纹理视图而不是表面视图从相机直播视频?

将实时视频广播从 android 相机流式传输到服务器

将音频流式传输到本地网络

是否可以将音乐从 Android/iOS 设备流式传输到桌面设备?

如何在 iOS 上通过安全连接流式传输视频