Youtube API无法创建两个同时绑定的直播和直播(1到1)

时间:2017-03-14 18:03:36

标签: node.js youtube-api youtube-data-api google-api-nodejs-client youtube-livestreaming-api

首先,我将解释如何使用Youtube API创建实时流,然后第二个我将解释用例第三,我将粘贴我的代码段。

工作原理:

基本上你需要创建一个livebroadcast(youtube.liveBroadcasts.insert)并获得 livebroadcast id (1) 然后创建一个直播(youtube.liveStreams.insert)并从中获取直播ID (2)一旦你需要绑定直播到livebroadcast({ {1}}):

绑定的结果基本上包含流URL。

用例

基本上它是一个直播的api:用户注册一个或多个youtube帐户,我运行以下代码创建直播并获取rtmp网址,以便我可以在多个YouTube频道上同时传输。

代码

youtube.liveBroadcasts.bind

当我调用此代码两次(在for循环中)时,Youtube api会返回错误:找不到Livebroadcast 好像某处存在竞争条件导致创建1个单独的所有其他人都失败了。 我必须做的一个肮脏的解决方法是添加超时(每2秒),但如果多个用户将使用"我的API"这将导致整个事情失败。

现在我正在考虑创建一个管理youtube直播流创建的队列。想知道是否有人有这个问题...

1 个答案:

答案 0 :(得分:0)

问题是此代码包含在使用在其外部初始化的外部 oauth2Client 对象的函数中:

 const oauth2Client = new OAuth2( // initialize the object outside is wrong 
      YOUTUBE_CLIENT_ID,          // when you wanna use new tokens 
      YOUTUBE_CLIENT_SECRET,      // inside the function.
      YOUTUBE_REDIRECT_URL
 );

var createLiveEvent = function(target, callback) {

    var youtubeDestination = target.destination
    var youtube_tokens = youtubeDestination.user_data;

    oauth2Client.setCredentials({
        access_token: youtube_tokens.access_token,    //tokens got from oauth2 authentication
        refresh_token: youtube_tokens.refresh_token,
        expiry_date: true
    });


    var youtube = google.youtube({
        version: 'v3',
        auth: oauth2Client
    });

    logger.debug("Youtube: Creating event on Channel ")
    ....
    ....

})

解决方案实际上是为每个不同的access_token / refresh_token使用不同的 oauth2Client 对象内部

var createLiveEvent = function(target, callback) {
    let oauth2Client = new OAuth2(
        YOUTUBE_CLIENT_ID,
        YOUTUBE_CLIENT_SECRET,
        YOUTUBE_REDIRECT_URL
    );


    var youtubeDestination = target.destination
    var youtube_tokens = youtubeDestination.user_data;

    oauth2Client.setCredentials({
        access_token: youtube_tokens.access_token,
        refresh_token: youtube_tokens.refresh_token,
        expiry_date: true
    });

    ....
    ....
});