在unity3D应用程序中显示Twitch.tv流

时间:2016-01-18 14:39:30

标签: unity3d video-streaming twitch

我想创建一个Unity3D应用程序,在其中可以观看当前的Twitch.tv直播。

我不确定这是否可行,例如,使用twitch api(https://github.com/justintv/twitch-api

我知道Unity3D中的视频纹理,我知道如何使用默认的twitch api基础知识,但我不知道如何将正在运行的抽搐流集成到我的应用程序中。

如果有可能,有人可以给我一个暗示吗?

非常感谢和最诚挚的问候 麦菲

6 个答案:

答案 0 :(得分:1)

最终来自抽搐的流是MPEG-4(H264 / M3U)。因此,如果您可以在Unity中渲染它,那么您可以渲染抽搐流。

有一些步骤可以从抽搐中获取正确的URL,这可能会随着时间的推移而发生变化。在播放流时,您必须检查当前的抽搐页面,以查看javascript如何构建请求(网址和标题)。

最后,javascript将构建一个访问令牌,然后使用它从一个抽搐边缘服务器请求一个名为index-live.m3u8的文件。该文件包含实时流的最后几秒(以及一些其他元数据)的文件名列表。它看起来像这样

https://video-edge-c61b44.lax01.hls.ttvnw.net/v0/[some-long-access-token]/index-live.m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#ID3-EQUIV-TDTG:2017-10-27T16:53:27
#EXT-X-MEDIA-SEQUENCE:8788
#EXT-X-TWITCH-ELAPSED-SECS:17576.000
#EXT-X-TWITCH-TOTAL-SECS:17589.870
#EXTINF:2.000,
index-0000008788-Y6OH.ts
#EXTINF:2.000,
index-0000008789-l0QY.ts
#EXTINF:2.000,
index-0000008790-gCUV.ts
#EXTINF:2.000,
index-0000008791-1ngg.ts
#EXTINF:2.000,
index-0000008792-wpQL.ts
#EXTINF:2.000,
index-0000008793-koO4.ts

然后将index-live.m3u8换成列表中文件的名称,并请求它获取该剪辑。类似的东西:

https://video-edge-c61b44.lax01.hls.ttvnw.net/v0/[the-same-long-access-token]/index-0000008793-koO4.ts

它将是一个大约1秒长的MPEG-4流。该列表大约有6个文件,所以如果你要求它们,你可以获得大约6秒的缓冲区。

每隔一两秒,index-live.m3u8会更新,旧文件会在新文件添加到底部时滚动。当缓冲区用完时,您需要每隔几秒钟重新请求此文件,并请求其中的新剪辑以保持播放。

答案 1 :(得分:1)

使用Ted Bigham的answer你可以获得视频的m3u8流。然后,您可以将此流投放到AVPro video from Renderheads这样的插件中,以便在任何形状或模型上直接以统一方式播放,并提供各种自定义和设置。

然而,这不是一个免费的插件,可能有其他选择。我与他们没有任何关系,但过去使用过这个插件效果很好。

p.s我本来想发布这个只是一个评论,并且相信Ted Bigham回答了你问题的咕噜声。但由于声誉不允许。

答案 2 :(得分:0)

我相信这个人想知道的是Twitch API是否实际检索实时视频源并将数据传递到应用程序。简短的回答是,它没有。 Twitch API不允许您拍​​摄实时视频,只能获取有关它的信息。

您可以获取字符串,告诉您频道的名称,游戏以及带您进入频道的链接。您还可以将其频道背景或预览作为图像文件。你不能做的是获取视频文件或流视频数据。您可以做的最好的事情是获取URL并链接到它们。

我能想到的在任何游戏中获得直播的唯一方法就是让它成为玩家。基本上你会编写一种方法来编写一个方法,通过这种方法,他们可以在游戏中自行传输游戏,在将数据上传到Twitch之前将流数据复制到某个变量或类中,这样你就可以同时使用这些数据它正在播出。但是如果你想要检索一些随机流媒体的游戏玩法并将其显示在你游戏的电脑屏幕上,我恐怕你不能那样做。无论如何,不​​是在Unity。

答案 3 :(得分:0)

  • 您可以将抽搐流嵌入网站
  • Unity(see
  • 有网络浏览器插件

因此,如果您结合这些想法,您可以通过运行应用内浏览器来显示统一的抽搐流,该浏览器将运行嵌入您想要的流的自定义网页。我不知道你会从中获得什么样的表现,但这听起来很简单。它可能不像在纹理上直接显示流那么简单,但它至少比学习C,网络编程,视频处理等更简单,如托马斯建议的那样。

答案 4 :(得分:0)

@Ted Bigham是否可以使用默认的统一视频播放器来做到这一点?

到目前为止,您所说的一切都很有效!仅使用Chrome,我就可以打开.m3u8并下载每个1秒的.ts文件。只要使用任何视频播放器,我就可以很好地查看每个视频文件。

但是,当我尝试通过视频播放器传递网址时,它显示“无法读取文件”。我什至尝试用.ts替换.mp4,因为这是受支持的格式。当我在Unity之外进行测试时,此方法有效,但给了我相同的错误。

这是我的代码。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Video;

public class TwitchStreamer : MonoBehaviour
{

    public string m3u8 = "https://video-weaver.atl01.hls.ttvnw.net/v1/playlist/Cq4EuEYkh5IqurC4gy3nHqGhPVtUwH_" +
        "5QcQbCatC5Fhit9qbivMQ2rdh2MS_m_2OuLd3VS2mF0eTrCKrz8YTuDO19mcbIBMJL3BUMz4jnNuU_t-e53V51TOtaN3vcCk9n3Qr" +
        "dP0WyLREnVR0n_30d4PlUjjW4_si5Wr2XuePQ0dPtxP6jnsenKnX56YTLohtCN2-FdfSvHQMdfd0aw68FA4h9wawHoIM9-U6YRmPa" +
        "fDsfdCiZr_iToSR6lZi81VoYPVjt7Ygf7xKwhjlNwrvA5SnsAnWQGIOVt4UjDkNLw-hmNMAr7RT0iiDghKXZY1VI6Tuc-umB1VXYE" +
        "7BH5hHbDfHgB3_IYNb0fjoudtSuaZxISyWoazPrw3AibEO7k1-quhdcjarBTGpIi_dlPEp-yZlQOy98_OZY_tqjk8ZWTBIaAAYEG_" +
        "miwqsgH4d6eIfkh3ehyMvPQH1C5dVG9tQcSWPUYU6D6hWhxvJhEr-UC0_BYWIVzX7z_Uf74FJGIEqSQc0d6igiowdMM_lyD8ZV9BE" +
        "7wqQs3RegMPqux-AOfF-_Q7Ki2MBv9u7D9ZRXMH_cm20bTx5-ShEDRnWMApSfXK-9bAGNXUcw8YlBbHYeSN5VxEZMC2oGjcivBsGs" +
        "RPMTQ_yNBSM1S6GxFRIR4nqA-mbdXg3rXMW3V6MNybBb1lrrQeEqF1tdYE0rfxe3Ki5WWkxeKmSjMGbMl1tHCwMaReTYkQnX5Qhjl" +
        "HXXtKLtEIEEhB3cXW3oF05-E_q87s68JQIGgyIEKPiQlTsANR9zRc.m3u8";


    public float updateClip = 1f, updateFile = 6f;

    public VideoPlayer vp;

    Queue<string> urls;

    void OnEnable()
    {
        StartCoroutine(UpdateFile());
        //InvokeRepeating("UpdateFile", 0f, updateFile);
        InvokeRepeating("UpdateClip", updateClip, updateClip);
        urls = new Queue<string>();
        vp.prepareCompleted += Vp_prepareCompleted;
        vp.errorReceived += Vp_errorReceived;
    }

    private void Vp_errorReceived(VideoPlayer source, string message)
    {
        Debug.Log("4567: Playback preparation failed. " + message, source);
    }

    private void Vp_prepareCompleted(VideoPlayer source)
    {
        Debug.Log("4567: Playback preparation complete.");
        source.Play();
    }

    void OnDisable()
    {
        CancelInvoke();
        StopAllCoroutines();
        vp.prepareCompleted -= Vp_prepareCompleted;
        vp.errorReceived -= Vp_errorReceived;
    }

    void UpdateClip()
    {
        //vp.Stop();
        if (urls.Count > 0)
        {
            vp.url = urls.Dequeue();
            vp.Prepare();
            Debug.Log("4567: Prepare playback for " + vp.url);
        }
    }

    IEnumerator UpdateFile()
    {
        UnityWebRequest www = UnityWebRequest.Get(m3u8);
        yield return www.SendWebRequest();

        if (www.isNetworkError || www.isHttpError)
        {
            Debug.Log(www.error);
        }
        else
        {
            // Show results as text
            //Debug.Log(www.downloadHandler.text);
            string[] raw = www.downloadHandler.text.Split('\n');
            foreach (string line in raw)
            {
                if (line.Contains("http"))
                {
                    string cnvrt = line.Replace(".ts", ".mp4");
                    urls.Enqueue(cnvrt);
                    Debug.Log(line + " has been added to stream queue.");
                }
            }
            // Or retrieve results as binary data
            //byte[] results = www.downloadHandler.data;
        }
        yield return new WaitForSeconds(updateFile);
    }
}

答案 5 :(得分:-1)

这是一个棘手的事情。您需要来自Twitch的API密钥,该程序不仅可以建立与您选择的API的连接,还可以建立数据流。我建议从使用C等不太专业的语言学习基本的网络编程开始,并从那里开始工作。了解基础知识后,请回来询问更具体的问题。在这个状态中,我不能用这个问题做那么多。

和其他一切一样,这绝对是可能的,也许不是用C#。为了不破坏游戏的性能,我建议编写一个单独的程序,将数据输入游戏,而游戏不会直接获取数据。

一旦你对网络编程有所了解,我就会跳到API上的twitch开发聊天,找到here