6

Stiamo utilizzando l'API YouTube Live Streaming in combinazione con lo Google API PHP Client e non riesco a capire come utilizzarlo per l'ingestione di base (preimpostata) anziché per uno personalizzato.Utilizzo dell'inserimento di base quando si utilizza l'API YouTube Live Streaming o si eliminano quelli personalizzati duplicati

Quelli personalizzati sono OK, ma per qualche motivo, anche se li chiami con lo stesso nome, crea continuamente duplicati per ogni stream che crei.

Quindi la mia domanda è: come possiamo utilizzarlo per l'ingestione di base o essere in grado di selezionarne uno personalizzato senza crearne uno nuovo ogni volta?

Per esempio qui è l'ingestione di base è possibile selezionare quando si imposta un flusso manualmente all'interno del tuo account YouTube:

YouTube encoder

Il codice relativo PHP:

// 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($this->title); 
$broadcastSnippet->setDescription($this->desc); 
$broadcastSnippet->setScheduledStartTime($this->start_time); 

// Create an object for the liveBroadcast resource's status, and set the 
// broadcast's status. 
$status = new Google_Service_YouTube_LiveBroadcastStatus(); 
$status->setPrivacyStatus($this->privacy_status); 

// 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 = $this->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($this->stream_title); 

// 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(); 
# TODO: Update the below `Format` method to use the new 'resolution' and 'frameRate' methods 
$cdn->setFormat($this->format); 
$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 = $this->youtube->liveStreams->insert('snippet,cdn', $streamInsert, array()); 

// Bind the broadcast to the live stream. 
$bindBroadcastResponse = $this->youtube->liveBroadcasts->bind(
    $broadcastsResponse['id'], 'id,contentDetails', 
    array(
     'streamId' => $streamsResponse['id'], 
    )); 

risposta

0

Ok, da quello che posso dire che non c'è modo di utilizzare ingestione di base ma ho capito come utilizzarlo per l'importazione personalizzata esistente.

È possibile creare lo streaming tramite il codice se lo si desidera o crearlo manualmente nell'interfaccia di YouTube.

Una volta eseguita questa operazione è necessario ottenere lo stream ID dello stream che si desidera associare alla nuova trasmissione creata; Non potrei dire un modo per scoprire queste informazioni tramite l'interfaccia di YouTube in modo da poterlo fare anche con l'API.

È possibile utilizzare il seguente codice per ottenere un elenco di flussi con l'list method:

// Execute an API request that lists the streams owned by the user who 
// authorized the request. 
$streamsResponse = $this->youtube->liveStreams->listLiveStreams('id,snippet', array(
    'mine' => 'true', 
)); 

$htmlBody .= "<h3>Live Streams</h3><ul>"; 
foreach ($streamsResponse['items'] as $streamItem) { 
    $htmlBody .= sprintf('<li>%s (%s)</li>', $streamItem['snippet']['title'], 
         $streamItem['id']); 
} 
$htmlBody .= '</ul>'; 

Nota che il codice di cui sopra è un stub; puoi vedere un esempio completo nel metodo elenco collegato sopra; in pratica dovrai comunque effettuare chiamate a Google_Client, Google_Service_YouTube e assicurarti di avere un token di accesso valido, ecc.

Una volta che hai lo ID di flusso che avresti dovuto ottenere tramite il processo di cui sopra; è quindi possibile fare qualcosa di simile al seguente per utilizzare quel flusso specifico che si desidera:

// 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($this->title); 
$broadcastSnippet->setDescription($this->desc); 
$broadcastSnippet->setScheduledStartTime($this->start_time); 

// Create an object for the liveBroadcast resource's status, and set the 
// broadcast's status. 
$status = new Google_Service_YouTube_LiveBroadcastStatus(); 
$status->setPrivacyStatus($this->privacy_status); 

// 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 = $this->youtube->liveBroadcasts->insert('snippet,status', $broadcastInsert, array()); 

// Bind the broadcast to the live stream. 
$bindBroadcastResponse = $this->youtube->liveBroadcasts->bind(
    $broadcastsResponse['id'], 'id,contentDetails', 
    array(
     'streamId' => 'stream_id_here', // <-- Insert your stream ID here 
    )); 

Anche in questo caso, il codice di cui sopra è un stub.

Quindi, fondamentalmente la linea di fondo è una volta che hai il tuo ID di streaming che vuoi usare puoi rimuovere completamente la creazione di un codice di streaming e poi passare l'ID di flusso che dovresti già avere nella chiamata al Metodo bind e dovresti essere bravo.

Speriamo che questo aiuti qualcun altro.

2

I' Non sono sicuro di cosa intendi per "ingestione di base". Secondo l'API, l'unica proprietà di importazione impostabile è cdn.ingestionType che supporta solo l'importazione RTMP in questo momento.

L'equivalente delle impostazioni dell'encoder visualizzate nel portale Web era il valore cdn.format, fornito di un'interfaccia per selezionare la coppia con risoluzione di bitrate per la trasmissione in diretta. Questa proprietà è stata ritirata il 18 aprile 2016 a favore di due nuove proprietà: cdn.frameRate e cdn.resolution. I valori di bitrate elencati nel portale Web sono i bitrate consigliati per ciascuna risoluzione, che sono configurati dal codificatore, non dall'API.

L'impostazione corretta dei formati personalizzati cdn non deve causare oggetti di flusso live duplicati. Potrebbe esserci un bug altrove nel tuo codice. Se ritieni che si tratti di un difetto API, ti consiglio di aprire un ticket per Google here.

+0

Domanda aggiornata per mostrare un esempio di * ingestione di base *. – Brett

+0

@Brett ha aggiornato la mia risposta. – JAL

+0

Sì, sono a conoscenza del deprecato 'cdn.format', ma sfortunatamente il' PHP API Client di Google' non ha aggiunto il supporto per il nuovo modo di farlo ancora AFAIK; almeno nel ramo V1. – Brett