Phát trực tiếp

Để phát video trực tiếp, trước tiên, bạn phải tạo đối tượng LiveVideo. Đối tượng LiveVideo biểu thị nội dung phát. Bạn có thể tùy chỉnh thuộc tính của đối tượng này để kiểm soát chế độ cài đặt của nội dung phát. Sau khi tạo xong, API sẽ trả về ID của đối tượng LiveVideo và URL luồng. Sau đó, bạn có thể chuyển ID và URL này cho bộ mã hóa và dùng để truyền dữ liệu sang đối tượng LiveVideo.

Vào ngày 10/06/2024, Meta sẽ đưa ra các yêu cầu mới mà tài khoản phải đáp ứng thì mới có thể phát trực tiếp trên Facebook. Yêu cầu mới như sau:

Phát trực tiếp trên trang cá nhân của Người dùng

Để phát trực tiếp trên đối tượng User, hãy lấy mã truy cập dành cho Người dùng có quyền publish_video rồi gửi yêu cầu đến:

POST /<USER_ID>/live_videos?status=LIVE_NOW

Hãy xem tài liệu tham khảo về cạnh /live_videos để biết các thông số chuỗi truy vấn bổ sung mà bạn có thể thêm nhằm mô tả nội dung phát, chẳng hạn như phần mô tả và tiêu đề.

Khi thử nghiệm một lệnh gọi API, bạn có thể thêm thông số access_token và đặt thông số này là mã truy cập của mình. Tuy nhiên, khi thực hiện lệnh gọi bảo mật từ ứng dụng của bạn, hãy sử dụng lớp mã truy cập.

Sau khi thành công, API sẽ tạo đối tượng LiveVideo trên trang cá nhân của Người dùng này và trả về secure_stream_url cũng như id của đối tượng LiveVideo. Nội dung phát sẽ hiển thị trong bài viết trên trang cá nhân của Người dùng ngay sau khi bạn gửi dữ liệu đến URL luồng bảo mật. Bạn có thể truy vấn đối tượng LiveVideo để giám sát tình trạng của nội dung phát và kết thúc nội dung phát đó.

Yêu cầu mẫu

curl -i -X POST \
 "https://graph.facebook.com/v21.0/<USER_ID>/live_videos
   ?status=LIVE_NOW
   &title=Today%27s%20Live%20Video
   &description=This%20is%20the%20live%20video%20for%20today."

Phản hồi mẫu

{
  "id": "1953020644813104",      //<LIVE_VIDEO_ID>
  "stream_url": "rtmp://rtmp-api.facebook...",
  "secure_stream_url":"rtmps://rtmp-api.facebook..."
}

Phát trực tiếp trên Trang

Để phát trực tiếp video trên Page, hãy lấy mã truy cập Trang của quản trị viên Trang có quyền pages_read_engagementpages_manage_posts, rồi gửi yêu cầu đến:

POST /<PAGE_ID>/live_videos?status=LIVE_NOW

Hãy xem tài liệu tham khảo về cạnh /live_videos để biết các thông số chuỗi truy vấn bổ sung mà bạn có thể thêm nhằm mô tả nội dung phát, chẳng hạn như phần mô tả và tiêu đề.

Khi thử nghiệm một lệnh gọi API, bạn có thể thêm thông số access_token và đặt thông số này là mã truy cập của mình. Tuy nhiên, khi thực hiện lệnh gọi bảo mật từ ứng dụng của bạn, hãy sử dụng lớp mã truy cập.

Sau khi thành công, API sẽ tạo đối tượng LiveVideo trên Trang này và trả về secure_stream_url cũng như id của đối tượng LiveVideo. Nội dung phát sẽ hiển thị trong bài viết trên Trang ngay sau khi bạn gửi dữ liệu đến URL luồng bảo mật. Bạn có thể truy vấn đối tượng LiveVideo để giám sát tình trạng của nội dung phát và kết thúc nội dung phát đó.

Yêu cầu mẫu

curl -i -X POST \
  "https://graph.facebook.com/v21.0/<PAGE_ID>/live_videos
    ?status=LIVE_NOW
    &title=Today%27s%20Page%20Live%20Video
    &description=This%20is%20the%20live%20video%20for%20the%20Page%20for%20today"

Phản hồi mẫu

{
  "id": "1953020644813108",     //<LIVE_VIDEO_ID>
  "stream_url": "rtmp://rtmp-api.facebook...",
  "secure_stream_url":"rtmps://rtmp-api.facebook..."
}

Lấy dữ liệu luồng phát trực tiếp

Bạn có thể đọc đối tượng LiveVideo để lấy URL xem trước của luồng phát trực tiếp và dữ liệu về tình trạng phát trực tiếp, chẳng hạn như tốc độ bit và tỷ lệ khung hình. Dữ liệu tình trạng phát trực tiếp sẽ làm mới 2 giây một lần. Do đó, hãy giới hạn truy vấn để không vượt quá 2 giây một lần. Hệ thống sẽ phát hiện và báo cáo hết thời gian chờ phát trực tiếp sau khi không nhận được dữ liệu nào trong 4 giây.

Để đọc đối tượng LiveVideo, hãy lấy mã truy cập dành cho Người dùng hoặc mã truy cập Trang phù hợp có quyền publish_video, rồi gửi truy vấn đến:

GET /<LIVE_VIDEO_ID>?fields=<COMMA_SEPARATED_LIST_OF_FIELDS>

Sử dụng thông số {fields} để chỉ định các trường đối tượng LiveVideo mà bạn muốn nhận được. Ví dụ: sau đây là yêu cầu lấy ingest_streams trên đối tượng LiveVideo, có chứa dữ liệu về tình trạng phát trực tiếp:

Yêu cầu mẫu

curl -i -X GET \
  "https://graph.facebook.com/v21.0/<LIVE_VIDEO_ID>?fields=ingest_streams"

Phản hồi mẫu

{
  "ingest_streams": [
    {
      "stream_id": "0",
      "stream_url": "rtmp://rtmp-api.facebook...",
      "secure_stream_url": "rtmps://rtmp-api.facebook...",
      "is_master": true,
      "stream_health": {
        "video_bitrate": 4024116,
        "video_framerate": 60,
        "video_gop_size": 2000,
        "video_height": 720,
        "video_width": 1280,
        "audio_bitrate": 128745.4921875
      },
      "id": "1914910145231512"  // <INGEST_STREAM_ID>
    }
  ],
  "id": "<LIVE_VIDEO_ID>" 
}

Thuộc tính phản hồi

Tên trườngMô tả
audio_bitrate

Số bit/giây của luồng âm thanh đến.

is_master

true nếu ID Video trực tiếp được truy vấn là video đang được phân phối cho đối tượng.

secure_stream_url

URL thu thập dữ liệu RTMPS bảo mật dành cho ID Video trực tiếp đang được truy vấn.

stream_url

URL thu thập dữ liệu RTMP dành cho ID Video trực tiếp đang được truy vấn.

video_bitrate

Số bit/giây của luồng video đến.

video_framerate

Số khung hình/giây của luồng video đến.

video_gop_size

Kích thước GOP (nhóm ảnh) tính bằng mili giây.

video_height

Chiều cao tính bằng pixel của khung hình video đến.

video_width

Chiều rộng tính bằng pixel của khung hình video đến.

Kết thúc nội dung phát

Để kết thúc nội dung phát, hãy ngừng phát dữ liệu video trực tiếp từ bộ mã hóa của bạn sang URL luồng hoặc gửi yêu cầu đến:

POST /<LIVE_VIDEO_ID>?end_live_video=true

Thao tác này sẽ đặt trạng thái của đối tượng LiveVideoVOD rồi lưu lại dưới dạng video theo yêu cầu (VOD) để có thể xem lại sau.

Sau khi thành công, API sẽ trả về ID của đối tượng LiveVideo.

Yêu cầu mẫu

curl -i -X POST \
  "https://graph.facebook.com/v21.0/<LIVE_VIDEO_ID>?end_live_video=true"

Phản hồi mẫu

{
  "id": "10213570560993813"  //<LIVE_VIDEO_ID>
}

Bạn có thể thực hiện thao tác GET trên ID LiveVideo để xác nhận rằng trạng thái của video đó đã được đặt là VOD:

GET /<LIVE_VIDEO_ID>?fields=status

Phản hồi mẫu

{
  "status": "VOD",  // Broadcast ended, saved as VOD
  "id": "10213570560993813"    //<LIVE_VIDEO_ID>
}

Xóa nội dung phát

Để xóa nội dung phát đã kết thúc và lưu dưới dạng VOD, hãy gửi yêu cầu đến:

DELETE /<LIVE_VIDEO_ID>

Yêu cầu mẫu

curl -i -X DELETE \
 "https://graph.facebook.com/v21.0/<LIVE_VIDEO_ID>"

Phản hồi mẫu

{
  success: true
}

Phát trực tiếp chính xác theo khung hình

Trước khi phát trực tiếp, hệ thống có thể cần chút thời gian trong khi chúng tôi giải mã dữ liệu phát trực tiếp ban đầu và xử lý bất kỳ yêu cầu API nào có liên quan. Do đó, người phát có thể khó biết được chính xác thời điểm bắt đầu nội dung phát. Để tránh vấn đề này, bạn có thể đặt đối tượng LiveVideo để chấp nhận dữ liệu phát nhưng không phát trực tiếp đến các đối tượng cho đến khi có thông báo RTMP phát trực tiếp trong chính dữ liệu phát. Cách này cho phép bất kỳ ai có thể xem trước nội dung phát đều xem phát trực tiếp được, đồng thời cho phép bộ mã hóa phát trực tiếp kiểm soát chính xác cả thời gian phát trực tiếp cho đối tượng lẫn khung hình đầu tiên mà đối tượng đó nhìn thấy.

Để bật tính năng phát trực tiếp chính xác theo khung hình, đầu tiên, hãy tạo đối tượng LiveVideo như bạn thường làm và đặt trạng thái của đối tượng này là PREVIEW (XEM TRƯỚC). Sau khi tạo, hãy truy vấn đối tượng LiveVideo và yêu cầu trường secure_stream_url kèm theo các trường lồng nhau sau đây:

secure_stream_url.inband_go_live(require_inband_signal)

Thao tác này sẽ bật tính năng phát trực tiếp chính xác theo khung hình trên đối tượng LiveVideo và API sẽ phản hồi bằng URL luồng bảo mật mới để bạn phát đến URL này. Bạn có thể bỏ qua URL luồng bảo mật ban đầu mà mình nhận được khi tạo đối tượng LiveVideo đầu tiên.

Nội dung phát sẽ phát trực tiếp và hiển thị cho đối tượng sau khi (1) bạn đặt trạng thái nội dung phát là LIVE (TRỰC TIẾP) (thông qua lệnh gọi API Đồ thị hoặc người dùng đăng từ Live Producer) (2) bộ mã hóa gửi thông báo RTMP phát trực tiếp.

Cấu trúc thông báo RTMP phát trực tiếp

Gói tin AMF0 (loại 0x12) chứa:

  • chuỗi onGoLive
  • mảng ECMA (loại 0x08) chứa một cặp khóa-giá trị duy nhất:
    • Khóa: chuỗi (loại 0x02) timestamp
    • Giá trị: số (loại 0x00): nhãn thời gian của khung hình video đầu tiên sẽ hiển thị công khai

Để biết thêm thông tin, hãy xem quy cách của RTMPAMF0.

Yêu cầu mẫu

Yêu cầu mẫu để bật tính năng phát trực tiếp chính xác theo khung hình trên LiveVideo.

curl -i -X GET \
   "https://graph.facebook.com/v21.0/LIVE_VIDEO_ID?fields=secure_stream_url.inband_go_live(require_inband_signal)&access_token=12345..."

Phản hồi mẫu

URL luồng bảo mật dành cho đối tượng LiveVideo đã bật tính năng phát trực tiếp chính xác theo khung hình.

{
  "secure_stream_url": "rtmps://rtmp-pc.facebook.com:443/rtmp/LIVE_VIDEO_ID?s_bl=1&s_gl=1&...",
  "id": "LIVE_VIDEO_ID"
}

Lấy dữ liệu về mã lỗi

Để lấy dữ liệu về mã lỗi liên quan đến nội dung phát, hãy gửi yêu cầu đến:

GET /<LIVE_VIDEO_ID>?fields=errors

API sẽ phản hồi bằng error code, type, messagetimestamp.

Phản hồi mẫu

curl -i -X GET \
 "https://graph.facebook.com/v21.0/<LIVE_VIDEO_ID>?fields=errors"

Phản hồi mẫu

{
  "errors": {
    "data": [
      {
        "error_code": 1969004,
        "error_type": "stream",
        "error_message": "Video signal lost",
        "creation_time": "2018-12-05T23:58:52+0000"
      },
      {
        "error_code": 1969004,
        "error_type": "stream",
        "error_message": "Video signal lost",
        "creation_time": "2018-12-05T23:58:52+0000"
      },
      {
        "error_code": 0,
        "error_type": "info",
        "error_message": "Live Service received the video signal",
        "creation_time": "2018-12-05T23:58:02+0000"
      },
      {
        "error_code": 0,
        "error_type": "info",
        "error_message": "Live Service received the video signal",
        "creation_time": "2018-12-05T23:58:02+0000"
      }
    ]
  },
  "id": "{your-live-video-id}"
}

Mã lỗi thường gặp của API Video trực tiếp

error_subcodeTóm tắt lỗiMô tả
COPYRIGHT__LIVE_COPYRIGHT_VIOLATION

Vi phạm bản quyền trực tiếp

Video trực tiếp của bạn đã bị ngừng do có thể chứa nội dung âm thanh hoặc hình ảnh thuộc sở hữu của một Trang khác.

VIDEO__CREATE_FAILED

Sự cố tải lên

Đã xảy ra sự cố và video của bạn không tải lên được. Vui lòng thử lại.

LIVE_VIDEO__DELETE_FAILED

Không xóa được video trực tiếp

Đã xảy ra sự cố và chúng tôi không thể xóa video trực tiếp của bạn. Vui lòng thử lại.

LIVE_VIDEO__EDIT_API_NOT_ALLOWED

Không được phép chỉnh sửa qua API Video trong khi phát trực tiếp

Không được phép chỉnh sửa video trực tiếp bằng API Chỉnh sửa video. Hãy sử dụng ID video trực tiếp.

LIVE_VIDEO__LIVE_STREAM_ERROR

Luồng chung

Đã xảy ra lỗi trong luồng

LIVE_VIDEO__NOT_EXIST

Video trực tiếp không tồn tại

Video trực tiếp mà bạn đang cố truy cập không tồn tại trong hệ thống nữa.

LIVE_VIDEO__PRIVACY_REQUIRED

Cần cài đặt quyền riêng tư

Bạn cần phải đặt quyền riêng tư trước khi phát trực tiếp.

Mã lỗi về quyền

CodeSubcodeMessageTypeMitigation messaging

200

1363120

Permissions error

OAuthException

You’re not eligible to go live

Your profile needs to be at least 60 days old before you can go live on Facebook. Learn more at https://www.facebook.com/business/help/167417030499767?id=1123223941353904

200

1363144

Permissions error

OAuthException

You’re not eligible to go live

You need at least 100 followers before you can go live from your profile. Learn more at https://www.facebook.com/business/help/167417030499767?id=1123223941353904