I am facing a problem with YouTube APIs, I am using ("google/apiclient": "2.7")
I have created broadcast and bind it to stream, then added the RTMP URL as an endpoint to my live stream But I couldn't find a way to start the live streaming on YouTube (after the original live starts)
$access_token = $data['yt-access-token'];
$title = $data['title'];
$description = $data['description'];
//=======================================//
$client = new Google_Client();
$client->setClientId(env('GOOGLE_APP_ID'));
$client->setClientSecret(env('GOOGLE_SECRET'));
$client->setScopes('https://www.googleapis.com/auth/youtube');
$client->setAccessToken($access_token);
// Define an object that will be used to make all API requests.
$youtube = new Google_Service_YouTube($client);
//=======================================//
try {
// Create an object for the liveBroadcast resource's snippet. Specify values
// for the snippet's title, scheduled start time, and scheduled end time.
$broadcastSnippet = new Google_Service_YouTube_LiveBroadcastSnippet();
$broadcastSnippet->setTitle($title);
$broadcastSnippet->setDescription($description);
$broadcastSnippet->setScheduledStartTime('2020-08-20T00:00:00.000Z');
$broadcastSnippet->setScheduledEndTime('2020-08-25T00:00:00.000Z');
// Create an object for the liveBroadcast resource's status, and set the
// broadcast's status to "private".
$status = new Google_Service_YouTube_LiveBroadcastStatus();
$status->setPrivacyStatus('public'); //private or public
// Create the API request that inserts the liveBroadcast resource.
$broadcastInsert = new Google_Service_YouTube_LiveBroadcast();
$broadcastInsert->setSnippet($broadcastSnippet);
$broadcastInsert->setStatus($status);
$broadcastInsert->setKind('youtube#liveBroadcast');
// Execute the request and return an object that contains information
// about the new broadcast.
$broadcastsResponse = $youtube->liveBroadcasts->insert('snippet,status', $broadcastInsert, array());
// Create an object for the liveStream resource's snippet. Specify a value
// for the snippet's title.
$streamSnippet = new Google_Service_YouTube_LiveStreamSnippet();
$streamSnippet->setTitle($title.' Stream');
// Create an object for content distribution network details for the live
// stream and specify the stream's format and ingestion type.
$cdn = new Google_Service_YouTube_CdnSettings();
$cdn->setFormat("1080p");
$cdn->setIngestionType('rtmp');
// Create the API request that inserts the liveStream resource.
$streamInsert = new Google_Service_YouTube_LiveStream();
$streamInsert->setSnippet($streamSnippet);
$streamInsert->setCdn($cdn);
$streamInsert->setKind('youtube#liveStream');
// Execute the request and return an object that contains information
// about the new stream.
$streamsResponse = $youtube->liveStreams->insert('snippet,cdn', $streamInsert, array());
// Bind the broadcast to the live stream.
$bindBroadcastResponse = $youtube->liveBroadcasts->bind(
$broadcastsResponse['id'],'id,contentDetails',
array(
'streamId' => $streamsResponse['id'],
)
);
$id = $streamsResponse->id;
$rtmp_url = $streamsResponse->cdn->ingestionInfo->ingestionAddress.'/'.$streamsResponse->cdn->ingestionInfo->streamName;
return [
'id' => $id,
'rtmp_url' => $rtmp_url
];
} catch (Google_Service_Exception $e) {
$htmlBody = sprintf('<p>A service error occurred: <code>%s</code></p>',
htmlspecialchars($e->getMessage()));
} catch (Google_Exception $e) {
$htmlBody = sprintf('<p>An client error occurred: <code>%s</code></p>',
htmlspecialchars($e->getMessage()));
}
I found these options in the YouTube Manage room, but I couldn't find them in the API
any solutions?
According to the docs, you have at your disposal the following two properties of LiveBroadcasts resource
:
contentDetails.enableAutoStart (boolean)
Indicates whether this broadcast should start automatically when you start streaming video on the bound live stream.contentDetails.enableAutoStop (boolean)
Indicates whether this broadcast should stop automatically around one minute after the channel owner stops streaming video on the bound video stream.
These two properties are allowed to be set at your will via the two modifying endpoints LiveBroadscasts.insert
and Livebroadcasts.update
.
W.r.t. your code, you would have to do something like:
$contentDetails = new Google_Service_YouTube_LiveBroadcastContentDetails();
$contentDetails->setEnableAutoStart(true);
$contentDetails->setEnableAutoStop(true);
then also:
$broadcastInsert->setContentDetails($contentDetails);
and replace the call to $youtube->liveBroadcasts->insert
with:
$broadcastsResponse = $youtube->liveBroadcasts->insert('snippet,status,contentDetails', $broadcastInsert, array());