YouTube 服务在 Windows 8 和 Windows 10 上的网络摄像头视频实时上传






4.26/5 (8投票s)
在 Windows 8 和 Windows 10 上的 YouTube 服务上,模拟从网络摄像头直接直播视频。
引言
本文介绍了一种不寻常的解决方案,用于将 CaptureManager 与 YouTube 服务集成。它允许使用 YouTube 服务不太为人所知的功能,将直播视频上传到 YouTube 频道。
背景
本文的主要思想是在视频托管服务的客户端应用程序中使用 CaptureManager。 选择 YouTube 服务是因为其客户端代码上传视频文件简单。 但是,本项目实现了另一种上传视频文件的观点 - 将编码后的视频流从写入文件重定向到 YouTube 服务的上传流。 这允许模拟流媒体视频的功能。
此解决方案的优势
- 与托管的简单连接 - 在 YouTube 上进行直播需要初始化流功能、创建事件、创建事件计划。此解决方案只需要一个 Google 帐户即可在 YouTube 频道上直播视频。
- 最少的附加库 - 仅 YouTube 框架和 CaptureManager。
此解决方案的缺点
- 视频只能在上传完成后访问。
- 应用程序和 YouTube 服务之间意外关闭连接会导致视频文件损坏。
使用代码
该项目的代码基于 CaptureManager 和 Google YouTube.v3.Data 框架。 在 YouTube 客户端的演示示例中,可以通过以下链接获取:https://github.com/youtube/api-samples/tree/master/dotnet,以下代码展示了将文件上传到 YouTube:
using (var fileStream = new FileStream(filePath, FileMode.Open))
{
var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet,status", fileStream, "video/*");
videosInsertRequest.ProgressChanged += videosInsertRequest_ProgressChanged;
videosInsertRequest.ResponseReceived += videosInsertRequest_ResponseReceived;
await videosInsertRequest.UploadAsync();
}
在此代码中,FileStream
是用于打开文件的类,但方法 youtubeService.Videos.Insert
不使用 FileStream
类。 它采用 Stream
抽象类。
public virtual VideosResource.InsertMediaUpload Insert(Video body, string part, Stream stream, string contentType)
这引出了下一个想法 - 创建一个从 Stream
抽象类继承的流类。 通过模拟 Stream
抽象类进行的测试表明,在将属性 CanSeek
设置为 false
后,YouTube 服务不会检查属性 Length
和 Position
。 更重要的是,它开始调用 Read
方法并在同步模式下工作。
public override bool CanSeek
{
get { return false; }
}
在这个项目中,我编写了从 Stream
抽象类继承接口的 OutputStream
类。 此类围绕 CaptureManager 的 ByteStream
类进行包装,并通过 Read
方法将字节从 ByteStream
类的输出重定向到 YouTube 服务。 当然,CaptureManager 和 YouTube 服务在不同的线程中工作,并且需要正确地同步它们。 该同步由 ConcurrentQueue<byte[]>
类实现。 CaptureManager 的 ByteStream
类将字节块排队,OutputStream
类将字节块出队。
关闭捕获会话后,OutputStream
类通过 Read
方法返回 0 值,这是文件结束 - 流的信号。 YouTube 服务关闭与托管的上传连接,托管开始处理媒体文件以进行发布。 结果,它可以在 YouTube 频道上进行实时流式传输,而无需在本地存储上保留信息。
关注点
此演示程序使用 CaptureManager 商业试用版,捕获会话持续时间为 60 秒。 完整功能库可以通过以下链接获取:应用程序许可证 - $119.99
历史