0

I am not able to load my video live streaming on YouTube. I have gone through the YouTube documentation, tried searching on Google but no result to get success.

I have a complete running PHP example code to stream video live on YouTube and video is broadcasting but message is

Please stand by, Starting Soon

I am using this code

<?php

// Call set_include_path() as needed to point to your client library.
require_once 'Google/Service/Resource.php';
require_once 'Google/Service.php';
require_once 'Google/Client.php';
require_once 'Google/Service/YouTube.php';
session_start();

/*
 * You can acquire an OAuth 2.0 client ID and client secret from the
 * Google Developers Console <https://console.developers.google.com/>
 * For more information about using OAuth 2.0 to access Google APIs, please see:
 * <https://developers.google.com/youtube/v3/guides/authentication>
 * Please ensure that you have enabled the YouTube Data API for your project.
 */
$OAUTH2_CLIENT_ID = '**************';
$OAUTH2_CLIENT_SECRET = '****************';

$client = new Google_Client();
$client->setClientId($OAUTH2_CLIENT_ID);
$client->setClientSecret($OAUTH2_CLIENT_SECRET);
$client->setScopes('https://www.googleapis.com/auth/youtube');
$redirect = filter_var('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'],
    FILTER_SANITIZE_URL);
$client->setRedirectUri($redirect);

// Define an object that will be used to make all API requests.
$youtube = new Google_Service_YouTube($client);

if (isset($_GET['code'])) {
  if (strval($_SESSION['state']) !== strval($_GET['state'])) {
    die('The session state did not match.');
  }

  $client->authenticate($_GET['code']);
  $_SESSION['token'] = $client->getAccessToken();
  header('Location: ' . $redirect);
}

if (isset($_SESSION['token'])) {
  $client->setAccessToken($_SESSION['token']);
}

// Check to ensure that the access token was successfully acquired.
if ($client->getAccessToken()) {
  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('New Broadcast');
    $broadcastSnippet->setScheduledStartTime('2015-04-15T00:00:00.000Z');
    $broadcastSnippet->setScheduledEndTime('2015-04-16T00: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('private');

    // 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('New 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'],
        ));
    $htmlBody = '';
    $htmlBody .= "<h3>Added Broadcast</h3><ul>";
    $htmlBody .= sprintf('<li>%s published at %s (%s)</li>',
        $broadcastsResponse['snippet']['title'],
        $broadcastsResponse['snippet']['publishedAt'],
        $broadcastsResponse['id']);
    $htmlBody .= '</ul>';

    $htmlBody .= "<h3>Added Stream</h3><ul>";
    $htmlBody .= sprintf('<li>%s (%s)</li>',
        $streamsResponse['snippet']['title'],
        $streamsResponse['id']);
    $htmlBody .= '</ul>';

    $htmlBody .= "<h3>Bound Broadcast</h3><ul>";
    $htmlBody .= sprintf('<li>Broadcast (%s) was bound to stream (%s).</li>',
        $bindBroadcastResponse['id'],
        $bindBroadcastResponse['contentDetails']['boundStreamId']);
    $htmlBody .= '</ul>';

  } catch (Google_ServiceException $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()));
  }

  $_SESSION['token'] = $client->getAccessToken();
} else {
  // If the user hasn't authorized the app, initiate the OAuth flow
  $state = mt_rand();
  $client->setState($state);
  $_SESSION['state'] = $state;

  $authUrl = $client->createAuthUrl();
  $htmlBody = <<<END
  <h3>Authorization Required</h3>
  <p>You need to <a href="$authUrl">authorize access</a> before proceeding.<p>
END;
}
?>

<!doctype html>
<html>
<head>
<title>Bound Live Broadcast</title>
</head>
<body>
  <?=$htmlBody?>
</body>
</html>
  1. Creating Broadcast with snippet and status I.e insert method.
  2. Creating Live Stream with cdn (1080p, rtmp) and snippet with I.e insert.
  3. Binding these together with broadcast bind method.

When I go to my https://www.youtube.com/my_live_events it is showing new event created, but I am not getting where is cam missing to use live streaming.

JAL
  • 41,701
  • 23
  • 172
  • 300
  • Your code is copied and pasted exactly from Google, please add an attribution. https://developers.google.com/youtube/v3/live/docs/liveStreams/insert#examples – JAL Apr 15 '15 at 14:46

1 Answers1

0

When you create your Live Stream object in step 2, an ingestionAddress will be returned in the response under cdn -> ingestionInfo. This is your RTMP endpoint where you need to send your video, using the streamName returned as the stream key.

Your response will look something like this (I've obfuscated some of my personal YouTube info):

{
    cdn =     {
        format = 480p;
        ingestionInfo =         {
            backupIngestionAddress = "rtmp://b.rtmp.youtube.com/live2?backup=1";

            ingestionAddress = "rtmp://a.rtmp.youtube.com/live2";
            streamName = "xxxxxx";
        };
        ingestionType = rtmp;
    };
    etag = "\"xxxxxx\"";
    id = "xxxxxx";
    kind = "youtube#liveStream";
    snippet =     {
        channelId = "xxxxxx";
        description = "";
        publishedAt = "2015-04-15T14:33:43.000Z";
        title = "live_stream_test";
    };
}

Relevant documentation here.

JAL
  • 41,701
  • 23
  • 172
  • 300
  • Hello Jal , thanks for your reply. Yes I know it is returning stream address in response and I successfully used this address with third party software to send video (encoder). Now my question is how to use it without third party software (Adobe) like google hangout air. Google Hangout Air does not need any other software to go live. thanks – Dheeraj Maulekhi Apr 20 '15 at 13:20
  • The Hangouts API uses Google's own video encoder. You will need to write your own video encoder or use some other software, there's no way around that. – JAL May 13 '15 at 13:26
  • @JAL Can you please see my question : http://stackoverflow.com/questions/30550512/where-to-pass-video-stream-video-file-in-youtube-apis-java – VVB May 30 '15 at 19:55