Inicie la transmisión en vivo de YouTube por la API

Aug 18 2020

Tengo un problema con las API de YouTube, estoy usando ("google/apiclient": "2.7")

Creé una transmisión y la vinculé a la transmisión, luego agregué la URL de RTMP como un punto final a mi transmisión en vivo. Pero no pude encontrar una manera de iniciar la transmisión en vivo en YouTube (después de que comience la transmisión en vivo original).

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

Encontré estas opciones en la sala de administración de YouTube, pero no pude encontrarlas en la API

¿alguna solución?

Respuestas

1 stvar Aug 23 2020 at 18:40

De acuerdo con los documentos, tiene a su disposición las siguientes dos propiedades de LiveBroadcasts resource:

contentDetails.enableAutoStart (booleano)
Indica si esta transmisión debe comenzar automáticamente cuando comienza a transmitir video en la transmisión en vivo enlazada .

contentDetails.enableAutoStop (booleano)
Indica si esta transmisión debe detenerse automáticamente alrededor de un minuto después de que el propietario del canal deje de transmitir video en la transmisión de video enlazada.

Estas dos propiedades se pueden configurar a su voluntad a través de los dos puntos finales de modificación LiveBroadscasts.inserty Livebroadcasts.update.


Escribe tu código, tendrías que hacer algo como:

$contentDetails = new Google_Service_YouTube_LiveBroadcastContentDetails();
$contentDetails->setEnableAutoStart(true);
$contentDetails->setEnableAutoStop(true);

Después también:

$broadcastInsert->setContentDetails($contentDetails);

y reemplace la llamada a $youtube->liveBroadcasts->insertcon:

$broadcastsResponse = $youtube->liveBroadcasts->insert('snippet,status,contentDetails', $broadcastInsert, array());