Se actualizó este documento.
La traducción en español no está disponible todavía.
Actualización del documento en inglés: 5 oct. 2020

Transmisión

Para transmitir un video en vivo, primero debes crear un objeto LiveVideo. El objeto LiveVideo representa la transmisión, y puedes manipular las propiedades del objeto a fin de controlar la configuración de la transmisión. Una vez creado, la API devolverá el identificador del objeto LiveVideo y una URL del stream, que puedes pasar a tu codificador y utilizar para hacer stream de datos al objeto LiveVideo.

Transmitir en un usuario

Para transmitir en un perfil de usuario, obtén un token de acceso de usuario con el permiso publish_video y envía una solicitud a:

POST /{user-id}/live_videos?status=LIVE_NOW

Consulta la referencia del perímetro /live_videos para ver parámetros de cadena de consulta adicionales que puedes incluir para describir la transmisión, como un título y una descripción.

En caso de éxito, la API creará un objeto LiveVideo en el usuario y devolverá una secure_stream_url y el id del objeto LiveVideo. La transmisión aparecerá en una publicación en el perfil del usuario apenas envíes datos a la URL segura del stream Puedes consultar el objeto LiveVideo a fin de controlar el estado de la transmisión y finalizar la transmisión.

Ejemplo de solicitud

curl -i -X POST \
 "https://graph.facebook.com/{user-id}/live_videos
   ?status=LIVE_NOW
   &title=Today%27s%20Live%20Video
   &description=This%20is%20the%20live%20video%20for%20today.
   &access_token={access-token}"
GraphRequest request = GraphRequest.newPostRequest(
  accessToken,
  "/{user-id}/live_videos",
  new JSONObject("{\"title\":\"Today's Live Video\",\"description\":\"This is the live video for today.\"}"),
  new GraphRequest.Callback() {
    @Override
    public void onCompleted(GraphResponse response) {
      // Insert your code here
    }
});
request.executeAsync();
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
    initWithGraphPath:@"/{user-id}/live_videos"
           parameters:@{ @"status": @"LIVE_NOW",@"title": @""Today's Live Video"",@"description": @""This is the live video for today."",}
           HTTPMethod:@"POST"];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
    // Insert your code here
}];
FB.api(
  '/{user-id}/live_videos',
  'POST',
  {"status":"LIVE_NOW","title":"\"Today's Live Video\"","description":"\"This is the live video for today.\""},
  function(response) {
      // Insert your code here
  }
);
try {
  // Returns a `FacebookFacebookResponse` object
  $response = $fb->post(
    '/{user-id}/live_videos',
    array (
      'status' => 'LIVE_NOW',
      'title' => '"Today\'s Live Video"',
      'description' => '"This is the live video for today."'
    ),
    '{access-token}'
  );
} catch(FacebookExceptionsFacebookResponseException $e) {
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(FacebookExceptionsFacebookSDKException $e) {
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}
$graphNode = $response->getGraphNode();

Ejemplo de respuesta

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

Transmitir en una página

Para transmitir un video en vivo en una página, obtén un token de acceso a la página del administrador de una página con los permisos pages_read_engagement y pages_manage_posts y, luego, envía una solicitud a:

POST /{page-id}/live_videos?status=LIVE_NOW

Consulta la referencia del perímetro /live_videos para ver parámetros de cadena de consulta adicionales que puedes incluir para describir la transmisión, como un título y una descripción.

En caso de éxito, la API creará un objeto LiveVideo en la página y devolverá una secure_stream_url y el id del objeto LiveVideo. La transmisión aparecerá en una publicación en la página apenas envíes datos a la URL segura del stream. Puedes consultar el objeto LiveVideo a fin de controlar el estado de la transmisión y finalizar la transmisión.

Ejemplo de solicitud

curl -i -X POST \
  "https://graph.facebook.com/{page-id}/live_videos
    ?status=LIVE_NOW
    &title=Today%27s%20Page%20Live%20Video
    &description=This%20is%20the%20live%20video%20for%20the%20Page%20for%20today
    &access_token=EAAC..."
GraphRequest request = GraphRequest.newPostRequest(
  accessToken,
  "/{page-id}/live_videos",
  new JSONObject("{\"title\":\"Today's Page Live Video\",\"description\":\"This is the live video for the Page for today.\"}"),
  new GraphRequest.Callback() {
    @Override
    public void onCompleted(GraphResponse response) {
      // Insert your code here
    }
});
request.executeAsync();
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
    initWithGraphPath:@"/{page-id}/live_videos"
           parameters:@{ @"status": @"LIVE_NOW",@"title": @""Today's Page Live Video"",@"description": @""This is the live video for the Page for today."",}
           HTTPMethod:@"POST"];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
    // Insert your code here
}];
FB.api(
  '/{page-id}/live_videos',
  'POST',
  {"status":"LIVE_NOW","title":"\"Today's Page Live Video\"","description":"\"This is the live video for the Page for today.\""},
  function(response) {
      // Insert your code here
  }
);
try {
  // Returns a `FacebookFacebookResponse` object
  $response = $fb->post(
    '/{page-id}/live_videos',
    array (
      'status' => 'LIVE_NOW',
      'title' => '"Today's Page Live Video"',
      'description' => '"This is the live video for the Page for today."'
    ),
    '{access-token}'
  );
} catch(FacebookExceptionsFacebookResponseException $e) {
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(FacebookExceptionsFacebookSDKException $e) {
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}
$graphNode = $response->getGraphNode();

Ejemplo de respuesta

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

Transmitir en un grupo

Para poder transmitir un video en vivo en un grupo, el grupo debe instalar tu app. El administrador del grupo puede hacer esto en www.facebook.com visitando el grupo, yendo a Editar la configuración del grupo > Apps > Agregar apps, y agregando tu app.

Para transmitir un video en vivo en un grupo que instaló tu app, obtén un token de acceso de usuario de un administrador del grupo con el permiso publish_video y, luego, envía una solicitud a:

POST /{group-id}/live_videos?status=LIVE_NOW

Consulta la referencia del perímetro /live_videos para ver parámetros de cadena de consulta adicionales que puedes incluir para describir la transmisión, como un título y una descripción.

En caso de éxito, la API creará un objeto LiveVideo en el grupo y devolverá una secure_stream_url y el id del objeto LiveVideo. La transmisión aparecerá en una publicación en el grupo apenas envíes datos a la URL segura del stream. Puedes consultar el objeto LiveVideo a fin de controlar el estado de la transmisión y finalizar la transmisión.

Ejemplo de solicitud

curl -i -X POST \
  "https://graph.facebook.com/{group-id}/live_videos
    ?status=LIVE_NOW
    &title=Today%27s%20Group%20Live%20Video
    &description=This%20is%20the%20live%20video%20for%20the%20group%20for%20today
    &access_token={access-token}"
GraphRequest request = GraphRequest.newPostRequest(
  accessToken,
  "/{group-id}/live_videos",
  new JSONObject("{\"title\":\"Today's Group Live Video\",\"description\":\"This is the live video for the Group for today.\"}"),
  new GraphRequest.Callback() {
    @Override
    public void onCompleted(GraphResponse response) {
      // Insert your code here
    }
});
request.executeAsync();
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
    initWithGraphPath:@"/{group-id}/live_videos"
           parameters:@{ @"status": @"LIVE_NOW",@"title": @""Today's Group Live Video"",@"description": @""This is the live video for the Group for today."",}
           HTTPMethod:@"POST"];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
    // Insert your code here
}];
FB.api(
  '/{group-id}/live_videos',
  'POST',
  {"status":"LIVE_NOW","title":"\"Today's Groups Live Video\"","description":"\"This is the live video for the Group for today.\""},
  function(response) {
      // Insert your code here
  }
);
try {
  // Returns a `FacebookFacebookResponse` object
  $response = $fb->post(
    '/{group-id}/live_videos',
    array (
      'status' => 'LIVE_NOW',
      'title' => '"Today's Group Live Video"',
      'description' => '"This is the live video for the Group for today."'
    ),
    '{access-token}'
  );
} catch(FacebookExceptionsFacebookResponseException $e) {
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(FacebookExceptionsFacebookSDKException $e) {
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}
$graphNode = $response->getGraphNode();

Ejemplo de respuesta

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

Obtener datos de streaming de la transmisión

Puedes leer un objeto LiveVideo a fin de obtener las URL de la vista previa del stream de transmisión y datos sobre el estado del stream, como la velocidad de los bits y la velocidad de los fotogramas. Los datos del estado del stream se actualizan cada dos segundos, de modo que no realices más de una consulta cada dos segundos. Se detectará e informará un tiempo de espera del stream después de cuatro segundos en que no se reciban datos.

Para leer un objeto LiveVideo, obtén un token de acceso de usuario o página adecuado con el permiso publish_video y, luego, envía una consulta a:

GET /{live-video-id}?fields={fields}

Utiliza el parámetro {fields} para especificar los campos del objeto de video en vivo que quieres que se devuelvan. Por ejemplo, esta es una solicitud para obtener ingest_streams del objeto LiveVideo, que incluye datos sobre el estado del stream:

Ejemplo de solicitud

curl -i -X GET \
  "https://graph.facebook.com/{live-video-id}
    ?fields=ingest_streams
    &access_token={access-token}"
GraphRequest request = GraphRequest.newGraphPathRequest(
  accessToken,
  "/{live-video-id}",  
  new JSONObject("{\"fields\":\"ingest_streams\"}"),
  new GraphRequest.Callback() {
    @Override
    public void onCompleted(GraphResponse response) {
      // Insert your code here
    }
});

Bundle parameters = new Bundle();
parameters.putString("fields", "ingest_streams");
request.setParameters(parameters);
request.executeAsync();
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
    initWithGraphPath:@"/{live-video-id}"     
           parameters:@{ @"fields": @"ingest_streams",}
           HTTPMethod:@"GET"];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
    // Insert your code here
}];
FB.api(
  '/{live-video-id}',     
  'GET',
  {"fields":"ingest_streams"},
  function(response) {
      // Insert your code here
  }
);
try {
  // Returns a `FacebookFacebookResponse` object
  $response = $fb->get(
    '/{live-video-id}',      
    '{access-token}'
  );
} catch(FacebookExceptionsFacebookResponseException $e) {
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(FacebookExceptionsFacebookSDKException $e) {
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}
$graphNode = $response->getGraphNode();

Ejemplo de respuesta

{
  "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": "{your-live-video-id}" 
}

Propiedades de la respuesta

Nombre del campoDescripción
audio_bitrate

Bits por segundo del stream de audio entrante.

is_master

true si el identificador del video en vivo que se está consultando es el video que se está transmitiendo a un público.

secure_stream_url

La URL RTMPS de ingesta segura del identificador del video en vivo que se consulta.

stream_url

La URL RTMP de ingesta del identificador del video en vivo que se consulta.

video_bitrate

Bits por segundo del stream de video entrante.

video_framerate

Fotogramas por segundo del stream de video entrante.

video_gop_size

Tamaño GOP (grupo de imágenes) en milisegundos.

video_height

Altura en píxeles del fotograma del video entrante.

video_width

Ancho en píxeles del fotograma del video entrante.

Finalizar una transmisión

Para finalizar una transmisión, detén el streaming de datos de video en vivo del codificador a la URL del stream o envía una solicitud a:

POST /{live-video-id}?end_live_video=true

Esto configura el estado del objeto LiveVideo en VOD y lo guarda como un video a petición (VOD) para que se pueda ver más tarde.

En caso de éxito, la API devolverá el identificador del objeto LiveVideo.

Ejemplo de solicitud

curl -i -X POST \
  "https://graph.facebook.com/{live-video-id}
    ?end_live_video=true
    &access_token={access-token}"
GraphRequest request = GraphRequest.newPostRequest(
  accessToken,
  "/live-video-id",
  new JSONObject("{\"end_live_video\":\"true\"}\"),
  new GraphRequest.Callback() {
    @Override
    public void onCompleted(GraphResponse response) {
      // Insert your code here
    }
});
request.executeAsync();
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
    initWithGraphPath:@"/{live-video-id}"
           parameters:@{ @"end_live_video": @"true",}
           HTTPMethod:@"POST"];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
    // Insert your code here
}];
FB.api(
  '/{live-video-id}',
  'POST',
  {"end_live_video":"true"},
  function(response) {
      // Insert your code here
  }
);
try {
  // Returns a `FacebookFacebookResponse` object
  $response = $fb->post(
    '/{live-video-id}',
    array (
      'end_live_video' => 'true'
    ),
    '{access-token}'
  );
} catch(FacebookExceptionsFacebookResponseException $e) {
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(FacebookExceptionsFacebookSDKException $e) {
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}
$graphNode = $response->getGraphNode();

Ejemplo de respuesta

{
  "id": "10213570560993813"
}

Puedes realizar una operación GET en el identificador del video en vivo a fin de confirmar que su estado se configuró en VOD:

GET /{live-video-id}?fields=status

Ejemplo de respuesta

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

Eliminar una transmisión

Para eliminar una transmisión que terminó y se guardó como un VOD, envía una solicitud a:

DELETE /{live-video-id}

Ejemplo de solicitud

curl -i -X DELETE \
 "https://graph.facebook.com/{live-video-id}?access_token={access-token}"
Bundle parameters = new Bundle();

GraphRequest request = new GraphRequest(
  accessToken,
  "/{live-video-id}",
  parameters,
  HttpMethod.DELETE,
  new GraphRequest.Callback() {
    @Override
    public void onCompleted(GraphResponse response) {
      // Insert your code here
    }
});

request.executeAsync();
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
    initWithGraphPath:@"{live-video-id}"
           parameters:nil
           HTTPMethod:@"DELETE"];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
    // Insert your code here
}];
FB.api(
  '/{live-video-id}',
  'DELETE',
  {},
  function(response) {
      // Insert your code here
  }
);
try {
  // Returns a `FacebookFacebookResponse` object
  $response = $fb->delete(
    '/{live-video-id}',
    array (),
    '{access-token}'
  );
} catch(FacebookExceptionsFacebookResponseException $e) {
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(FacebookExceptionsFacebookSDKException $e) {
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}
$graphNode = $response->getGraphNode();

Ejemplo de respuesta

{
  success: true
}

Obtener datos de un código de error

Para obtener datos de un código de error asociados con una transmisión, envía una solicitud a:

GET /{live-video-id}?fields=errors

La API responderá con error code, type, message y timestamp.

Ejemplo de respuesta

curl -i -X GET \
 "https://graph.facebook.com/{live-video-id}
   ?fields=errors
   &access_token={access-token}"
GraphRequest request = GraphRequest.newGraphPathRequest(
  accessToken,
  "/1951440638245129",
  new GraphRequest.Callback() {
    @Override
    public void onCompleted(GraphResponse response) {
      // Insert your code here
    }
});

Bundle parameters = new Bundle();
parameters.putString("fields", "errors");
request.setParameters(parameters);
request.executeAsync();
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
    initWithGraphPath:@"/1951440638245129"
           parameters:@{ @"fields": @"errors",}
           HTTPMethod:@"GET"];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
    // Insert your code here
}];
FB.api(
  '/1951440638245129',
  'GET',
  {"fields":"errors"},
  function(response) {
      // Insert your code here
  }
);
try {
  // Returns a `FacebookFacebookResponse` object
  $response = $fb->get(
    '/1951440638245129',
    '{access-token}'
  );
} catch(FacebookExceptionsFacebookResponseException $e) {
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(FacebookExceptionsFacebookSDKException $e) {
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}
$graphNode = $response->getGraphNode();

Ejemplo de respuesta

{ "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}" } 
error_subcodeResumen de erroresDescripción
COPYRIGHT__LIVE_COPYRIGHT_VIOLATION

Infracción de derechos de autor en el video en vivo

Tu video en vivo se detuvo porque puede incluir contenido de audio o video que pertenece a otra página.

VIDEO__CREATE_FAILED

Problema con la subida

Se produjo un problema y tu video no se subió. Vuelve a intentarlo.

LIVE_VIDEO__DELETE_FAILED

El video en vivo no se eliminó

Se produjo un problema y no pudimos eliminar tu video en vivo. Vuelve a intentarlo.

LIVE_VIDEO__EDIT_API_NOT_ALLOWED

No se puede editar con la API de video en vivo mientras se transmite en vivo

No se puede editar un video en vivo utilizando la API de edición de video. Usa el identificador del video en vivo.

LIVE_VIDEO__LIVE_STREAM_ERROR

Stream genérico

Se produjo un error durante el stream

LIVE_VIDEO__NOT_EXIST

El video en vivo no existe

El video en vivo al que intentas acceder ya no existe en el sistema.

LIVE_VIDEO__PRIVACY_REQUIRED

Se requiere configuración de privacidad

Debes configurar parámetros de privacidad antes de transmitir en vivo.