通过 API 启动 YouTube 直播

Abd*_*aha 5 php streaming youtube-api youtube-data-api

我遇到了 YouTube API 的问题,我正在使用 ("google/apiclient": "2.7")

我已经创建了广播并将其绑定到流,然后将 RTMP URL 作为端点添加到我的直播中但我找不到在 YouTube 上启动直播的方法(在原始直播开始后)

        $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()));
          }
Run Code Online (Sandbox Code Playgroud)

我在 YouTube 管理室中找到了这些选项,但在 API 中找不到它们

在此输入图像描述

有什么解决办法吗?

stv*_*var 2

根据文档,您可以使用以下两个属性LiveBroadcasts resource

contentDetails.enableAutoStart (boolean)指示当您在绑定的直播流
上开始流式传输视频时,是否应自动开始此广播。

contentDetails.enableAutoStop (boolean)
指示此广播是否应在频道所有者停止在绑定视频流上流式传输视频后一分钟左右自动停止。

LiveBroadscasts.insert允许通过两个修改端点和随意设置这两个属性Livebroadcasts.update


对于您的代码,您必须执行以下操作:

$contentDetails = new Google_Service_YouTube_LiveBroadcastContentDetails();
$contentDetails->setEnableAutoStart(true);
$contentDetails->setEnableAutoStop(true);
Run Code Online (Sandbox Code Playgroud)

然后还有:

$broadcastInsert->setContentDetails($contentDetails);
Run Code Online (Sandbox Code Playgroud)

并将调用替换为$youtube->liveBroadcasts->insert

$broadcastsResponse = $youtube->liveBroadcasts->insert('snippet,status,contentDetails', $broadcastInsert, array());
Run Code Online (Sandbox Code Playgroud)