YouTube 数据 API v3 : transition of 'ready' to 'live' broadcast fails with an active stream "403 Invalid Transition"

标签 youtube youtube-api youtube-data-api

我尝试将已经事件的流添加到新广播中,但无法开始广播。我采取的步骤是。

  1. 创建了一个新的广播。
curl --request POST \
  "https://youtube.googleapis.com/youtube/v3/liveBroadcasts?part=snippet,contentDetails,status" \
  --header "Authorization: Bearer XXX" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --data "{'snippet':{'scheduledStartTime':'2021-05-18T17:28:00Z','title':'Tester','description':'descr'},'status':{'privacyStatus':'public','selfDeclaredMadeForKids':false},'contentDetails':{'enableAutoStart':true,'recordFromStart':true,'latencyPreference':'normal','enableAutoStop':false}}"

{
  "kind": "youtube#liveBroadcast",
  "etag": "gyv8ux9AiVL_NuZefS8SGXc3iZQ",
  "id": "z--Lm8b1mU0",
  "snippet": {
    "publishedAt": "2021-05-18T17:27:39Z",
    "channelId": "XXXXXXXXXXXXXXXX",
    "title": "Tester",
    "description": "descr",
      ...
    },
    "scheduledStartTime": "2021-05-18T17:28:00Z",
    "isDefaultBroadcast": false,
    "liveChatId": "KicKGFVDRUZXb015R0VtWFdrcDdkV1BMWWRXQRILei0tTG04YjFtVTA"
  },
  "status": {
    "lifeCycleStatus": "created",
    "privacyStatus": "public",
    "recordingStatus": "notRecording",
    "madeForKids": false,
    "selfDeclaredMadeForKids": false
  },
  "contentDetails": {
    "monitorStream": {
      "enableMonitorStream": true,
      "broadcastStreamDelayMs": 0,
     ...
    },
    "enableEmbed": false,
    "enableDvr": true,
    "enableContentEncryption": false,
    "startWithSlate": false,
    "recordFromStart": true,
    "enableClosedCaptions": false,
    "closedCaptionsType": "closedCaptionsDisabled",
    "enableLowLatency": false,
    "latencyPreference": "normal",
    "projection": "rectangular",
    "enableAutoStart": true,
    "enableAutoStop": false
  }
}
  • 将已经事件的流绑定(bind)到广播。我希望创建的广播中的enableAutoStart能够自动启动广播,但事实并非如此。
  • curl --request POST "https://youtube.googleapis.com/youtube/v3/liveBroadcasts/bind?id=z--Lm8b1mU0&part=snippet,contentDetails,status&streamId=EFWoMyGEmXWkp7dWPLYdWA1615776388366728" --header "Authorization: Bearer XXXXXXXX" --header "Accept: application/json"
    {
      "kind": "youtube#liveBroadcast",
      "etag": "L_Q87yK0gMxEM7VZ-aKHCTZ7n8g",
      "id": "z--Lm8b1mU0",
      "snippet": {
        "publishedAt": "2021-05-18T17:27:39Z",
        "channelId": "UCEFWoMyGEmXWkp7dWPLYdWA",
        "title": "Tester",
        "description": "descr",
    
        },
        "scheduledStartTime": "2021-05-18T17:28:00Z",
        "isDefaultBroadcast": false,
        "liveChatId": "KicKGFVDRUZXb015R0VtWFdrcDdkV1BMWWRXQRILei0tTG04YjFtVTA"
      },
      "status": {
        "lifeCycleStatus": "ready",
        "privacyStatus": "public",
        "recordingStatus": "notRecording",
        "madeForKids": false,
        "selfDeclaredMadeForKids": false
      },
      "contentDetails": {
        "boundStreamId": "EFWoMyGEmXWkp7dWPLYdWA1615776388366728",
        "boundStreamLastUpdateTimeMs": "2021-05-18T16:58:04Z",
        "monitorStream": {
          "enableMonitorStream": true,
          "broadcastStreamDelayMs": 0,
         ...
        },
        "enableEmbed": false,
        "enableDvr": true,
        "enableContentEncryption": false,
        "startWithSlate": false,
        "recordFromStart": true,
        "enableClosedCaptions": false,
        "closedCaptionsType": "closedCaptionsDisabled",
        "enableLowLatency": false,
        "latencyPreference": "normal",
        "projection": "rectangular",
        "enableAutoStart": true,
        "enableAutoStop": false
      }
    }
    
  • 尝试将广播转为直播。我还尝试过渡到测试,但由于同样的错误而失败。
  • curl --request POST -H "Authorization: Bearer XXXXXX" "https://www.googleapis.com/youtube/v3/liveBroadcasts/transition?part=id,snippet,contentDetails,status&broadcastStatus=live&id=z--Lm8b1mU0"
    {
      "error": {
        "code": 403,
        "message": "Invalid transition",
        "errors": [
          {
            "message": "Invalid transition",
            "domain": "youtube.liveBroadcast",
            "reason": "invalidTransition",
            "extendedHelp": "https://developers.google.com/youtube/v3/live/docs/liveBroadcasts/transition#params"
          }
        ]
      }
    }
    
  • 已验证该信息流仍处于事件状态。
  • curl "https://youtube.googleapis.com/youtube/v3/liveStreams?part=snippet,cdn,contentDetails,status&id=EFWoMyGEmXWkp7dWPLYdWA1615776388366728" -H "Authorization: Bearer XXXXXXXXXXX" -H "Accept: application/json"
    {
      "kind": "youtube#liveStreamListResponse",
      "etag": "ejyo1UhcC8AFCfiY-TxKo4yhwv0",
      "pageInfo": {
        "totalResults": 0,
        "resultsPerPage": 5
      },
      "items": [
        {
          "kind": "youtube#liveStream",
          "etag": "IZNA8olA5tx8tu2fGKPg4ws0YpM",
          "id": "EFWoMyGEmXWkp7dWPLYdWA1615776388366728",
          "snippet": {
            "publishedAt": "2021-03-15T02:46:29Z",
            "channelId": "XXXXXXXXXXXXXXXXXXXXXXXX",
            "title": "Default stream key",
            "description": "Description for default stream key",
            "isDefaultStream": false
          },
          "cdn": {
            "ingestionType": "rtmp",
            "ingestionInfo": {
              "streamName": "XXXX-XXXX-XXXX-XXXX-XXXX",
              "ingestionAddress": "rtmp://a.rtmp.youtube.com/live2",
              "backupIngestionAddress": "rtmp://b.rtmp.youtube.com/live2?backup=1",
              "rtmpsIngestionAddress": "rtmps://a.rtmps.youtube.com/live2",
              "rtmpsBackupIngestionAddress": "rtmps://b.rtmps.youtube.com/live2?backup=1"
            },
            "resolution": "variable",
            "frameRate": "variable"
          },
          "status": {
            "streamStatus": "active",
            "healthStatus": {
              "status": "good"
            }
          },
          "contentDetails": {
           ...
            "isReusable": true
          }
        }
      ]
    }
    

    关于如何实现这项工作的想法?

    最佳答案

    我明白了。

    显然,您无法使用enableAutoStart=true 创建广播,然后添加事件流。看来,enableAutoStart=true 无法将广播转换 API 调用更改为测试、实时或完成状态。

    为了使其正常工作,我停止然后开始发送到流,这导致流转换为非事件状态,然后又恢复为事件状态。转换导致广播开始。

    或者,为了在不重新启动流的情况下使其正常工作,我执行了以下操作:

    1. 使用enableAutoStart=false创建广播
    2. 将事件流绑定(bind)到广播(如问题中所示)。
    3. 将广播转变为测试,然后转变为直播。

    这似乎工作正常。

    如果转换的错误消息表明问题出在 enableAutoStart 上,那就太好了。

    关于YouTube 数据 API v3 : transition of 'ready' to 'live' broadcast fails with an active stream "403 Invalid Transition",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67592373/

    相关文章:

    javascript - 如何隐藏视频中出现的 YouTube 播放按钮?

    meteor - 使用 Meteor 和 percolate 的 google-api 包访问 Youtube API

    codeigniter - CodeIgniter YouTube API库浏览器上传

    javascript - 分割 youtube 视频 url

    youtube - 如何获取给定 YouTube channel 的订阅者数量和视频数量?

    ruby-on-rails - Rails 在安全站点上嵌入 youtube 视频

    youtube - 如何将 CSS 背景图像( Sprite )制作成可点击区域?

    javascript - YouTube嵌入式视频无法在Safari的iOS 9上播放

    youtube - 如何使用YouTube Analytics(分析)API获取Youtube channel 的已订阅用户列表及其详细信息?

    youtube - YouTube v3 Javascript API-身份验证问题- “Refused to display”