Este documento se ha actualizado.
La traducción en Español (España) no está disponible todavía.
Actualización del documento en inglés: 5 oct. 2020

Transmisión

Para transmitir un vídeo en directo, primero debes crear un objeto LiveVideo. El objeto LiveVideo representa la transmisión. Puedes manipular las propiedades del objeto para controlar la configuración de la transmisión. Tras la creación, la API devolverá el identificador del objeto LiveVideo y una URL de transmisión, que puedes pasar al codificador y usar para transmitir datos al objeto LiveVideo.

Transmisión en un usuario

Para transmitir en un perfil de usuario, obtén un identificador 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 los parámetros de cadena de consulta adicionales que puedes incluir para describir la transmisión, como un título y una descripción.

Tras completar la operación correctamente, la API creará un objeto LiveVideo en el usuario y devolverá un elemento secure_stream_url y el valor de id del objeto LiveVideo. La transmisión aparecerá en una publicación en el perfil del usuario cuando envíes datos a la URL de transmisión segura. Puedes consultar el objeto LiveVideo para supervisar el estado de la transmisión y finalizarla.

Solicitud de ejemplo

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..."
}

Transmisión en una página

Para transmitir un vídeo en directo en una página, obtén un identificador de acceso a la página perteneciente a un administrador de la página con los permisos pages_read_engagement y pages_manage_posts, y envía una solicitud a:

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

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

Tras completar la operación correctamente, la API creará un objeto LiveVideo en la página y devolverá un elemento secure_stream_url y el valor de id del objeto LiveVideo. La transmisión aparecerá en una publicación en la página cuando envíes datos a la URL de transmisión segura. Puedes consultar el objeto LiveVideo para supervisar el estado de la transmisión y finalizarla.

Solicitud de ejemplo

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..."
}

Transmisión en un grupo

Antes de transmitir un vídeo en directo en un grupo, el grupo debe instalar tu aplicación. Un administrador del grupo puede hacerlo en www.facebook.com. Para ello, debe visualizar el grupo, ir a Editar configuración del grupo > Aplicaciones > Añadir aplicaciones y añadir tu aplicación.

Para transmitir un vídeo en directo en un grupo que ha instalado tu aplicación, obtén un identificador de acceso de usuario perteneciente a un administrador del grupo con el permiso publish_video y envía una solicitud a:

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

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

Tras completar la operación correctamente, la API creará un objeto LiveVideo en el grupo y devolverá un elemento secure_stream_url y el valor id del objeto LiveVideo. La transmisión aparecerá en una publicación en el grupo cuando envíes datos a la URL de transmisión segura. Puedes consultar el objeto LiveVideo para supervisar el estado de la transmisión y finalizarla.

Solicitud de ejemplo

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 la transmisión

Puedes leer un objeto LiveVideo para obtener las URL de vista previa de la transmisión y los datos sobre el estado de la transmisión, como las velocidades de bits y las velocidades de fotogramas. Los datos de estado de la transmisión se actualizan cada 2 segundos. Por tanto, limita las consultas a no más de una vez cada 2 segundos. Un tiempo de espera de la transmisión se detectará y notificará después de 4 segundos si no se recibe ningún dato.

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

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

Utiliza el parámetro {fields} para especificar los campos del objeto LiveVideo que quieres que se devuelvan. Por ejemplo, a continuación tienes una solicitud para obtener el campo ingest_streams en el objeto LiveVideo, que incluye datos sobre el estado de la transmisión:

Solicitud de ejemplo

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 de la transmisión de audio entrante.

is_master

Es true si el identificador de vídeo en directo que se consulta corresponde al vídeo que se está entregando a un público.

secure_stream_url

URL de ingesta RTMPS segura del identificador de vídeo en directo que se está consultando.

stream_url

URL de ingesta RTMP del identificador de vídeo en directo que se está consultando.

video_bitrate

Bits por segundo de la transmisión de vídeo entrante.

video_framerate

Fotogramas por segundo de la transmisión de vídeo entrante.

video_gop_size

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

video_height

Altura en píxeles del fotograma de vídeo entrante.

video_width

Anchura en píxeles del fotograma de vídeo entrante.

Finalizar una transmisión

Para finalizar una transmisión, deja de transmitir datos de vídeo en directo del codificador a la URL de transmisión o envía una solicitud a:

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

Esta operación establece el estado del objeto LiveVideo en VOD y lo guarda como un vídeo bajo demanda (VOD) para poder visualizarlo posteriormente.

Tras finalizar la operación correctamente, la API devolverá el identificador del objeto LiveVideo.

Solicitud de ejemplo

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 de LiveVideo para confirmar que su estado se ha establecido 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 ha finalizado y se ha guardado como un VOD, envía una solicitud a:

DELETE /{live-video-id}

Solicitud de ejemplo

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 del código de error

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

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

La API responderá con los campos 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 del errorDescripción
COPYRIGHT__LIVE_COPYRIGHT_VIOLATION

Infracción de copyright en directo

El vídeo en directo se ha detenido porque podría incluir contenido de audio o visual que pertenece a otra página.

VIDEO__CREATE_FAILED

Problema de subida

Ha habido un problema y no se pudo subir el vídeo. Vuelve a intentarlo.

LIVE_VIDEO__DELETE_FAILED

El vídeo en directo no se eliminó

Ha habido un problema y no hemos podido eliminar el vídeo en directo. Vuelve a intentarlo.

LIVE_VIDEO__EDIT_API_NOT_ALLOWED

No se puede editar en directo mediante una API de vídeo

No se puede editar un vídeo en directo mediante la API de edición de vídeo. Utiliza el identificador de vídeo en directo.

LIVE_VIDEO__LIVE_STREAM_ERROR

Transmisión genérica

Se produjo un error durante la transmisión.

LIVE_VIDEO__NOT_EXIST

El vídeo en directo no existe

El vídeo en directo al que intentas acceder ya no existe en el sistema.

LIVE_VIDEO__PRIVACY_REQUIRED

Se necesita la configuración de privacidad

Antes de la publicación, es necesario definir la privacidad.