65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.26/5 (8投票s)

2016 年 6 月 26 日

CPOL

2分钟阅读

viewsIcon

14722

downloadIcon

745

在 Windows 8 和 Windows 10 上的 YouTube 服务上,模拟从网络摄像头直接直播视频。

引言

本文介绍了一种不寻常的解决方案,用于将 CaptureManager 与 YouTube 服务集成。它允许使用 YouTube 服务不太为人所知的功能,将直播视频上传到 YouTube 频道。

背景

本文的主要思想是在视频托管服务的客户端应用程序中使用 CaptureManager。 选择 YouTube 服务是因为其客户端代码上传视频文件简单。 但是,本项目实现了另一种上传视频文件的观点 - 将编码后的视频流从写入文件重定向到 YouTube 服务的上传流。 这允许模拟流媒体视频的功能。

此解决方案的优势

  1. 与托管的简单连接 - 在 YouTube 上进行直播需要初始化流功能、创建事件、创建事件计划。此解决方案只需要一个 Google 帐户即可在 YouTube 频道上直播视频。
  2. 最少的附加库 - 仅 YouTube 框架和 CaptureManager。

此解决方案的缺点

  1. 视频只能在上传完成后访问。
  2. 应用程序和 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 服务不会检查属性 LengthPosition。 更重要的是,它开始调用 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

历史

 

© . All rights reserved.