如何从 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
(内部使用 CameraSource
和 MicSource
)从 iPhone 流式传输我的相机视频,但现在,我想要流式传输的视频来自 URL。类似于Periscope streaming video from GoPro Cam。
问题一:我不知道如何从一个RTSP URL中提取音视频
问题 2:我不知道如何从提取的视频和音频中创建 CameraSource
或 MicSource
。
您知道在哪里可以找到示例吗?或者您能帮我解决这个技术难题吗?
【问题讨论】:
【参考方案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) 视频的主要内容,如果未能解决你的问题,请参考以下文章