首先,我将解释如何使用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直播流创建的队列。想知道是否有人有这个问题...
答案 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
});
....
....
});