Este documento foi atualizado.
A tradução para Português (Brasil) não foi concluída ainda.
Atualização em inglês: 5 de out de 2020

Como fazer uma transmissão

Para transmitir um vídeo ao vivo, você primeiro precisa criar um objeto LiveVideo. O objeto LiveVideo representa a transmissão. É possível gerenciar as propriedades do objeto para controlar as configurações da transmissão. Após a criação, a API retornará o ID do objeto LiveVideo e uma URL de stream, que pode ser enviada ao codificador e usada para fazer stream de dados ao objeto LiveVideo.

Transmitir em um usuário:

Para transmitir em um perfil de Usuário, obtenha um token de acesso do Usuário com a permissão publish_video e envie uma solicitação para:

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

Consulte a referência da borda /live_videos para ver outros parâmetros de cadeia de caracteres de consulta que você pode incluir para descrever a transmissão, como o título e a descrição.

Se o processo for concluído, a API criará um objeto LiveVideo no usuário e retornará um secure_stream_url e o id do objeto LiveVideo. A transmissão será exibida em uma publicação no perfil do usuário assim que você enviar dados para a URL de stream segura. É possível consultar o objeto LiveVideo para monitorar a integridade e finalizar a transmissão.

Exemplo de solicitação

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();

Exemplo de resposta

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

Transmitir em uma Página

Para transmitir um vídeo ao vivo em uma Página, obtenha um token de acesso à Página de um administrador dela com as permissões pages_read_engagement e pages_manage_posts. Em seguida, envie uma solicitação para:

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

Consulte a referência da borda /live_videos para ver outros parâmetros de cadeia de caracteres de consulta que você pode incluir para descrever a transmissão, como o título e a descrição.

Se o processo for concluído, a API criará um objeto LiveVideo na Página e retornará um secure_stream_url e o id do objeto LiveVideo. A transmissão será exibida em uma publicação na Página assim que você enviar dados para a URL de stream segura. É possível consultar o objeto LiveVideo para monitorar a integridade e finalizar a transmissão.

Exemplo de solicitação

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();

Exemplo de resposta

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

Transmitir em um grupo

Antes que você possa transmitir um vídeo ao vivo em um grupo, o grupo precisa instalar seu aplicativo. Um admin pode fazer isso em www.facebook.com. Para isso, basta visualizar o grupo, acessar Editar configurações do grupo > Aplicativos > Adicionar aplicativos e adicionar o aplicativo.

Para transmitir um vídeo ao vivo em um grupo que tenha instalado seu aplicativo, obtenha um token de acesso do usuário de um administrador com a permissão publish_video e envie uma solicitação para:

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

Consulte a referência da borda /live_videos para ver outros parâmetros de cadeia de caracteres de consulta que você pode incluir para descrever a transmissão, como o título e a descrição.

Se o processo for concluído, a API criará um objeto LiveVideo no grupo e retornará um secure_stream_url e o id do objeto LiveVideo. A transmissão será exibida em uma publicação no grupo assim que você enviar dados para a URL de stream segura. É possível consultar o objeto LiveVideo para monitorar a integridade e finalizar a transmissão.

Exemplo de solicitação

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();

Exemplo de resposta

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

Obter dados de stream de transmissão

É possível ler um objeto LiveVideo para obter as URLs de prévia do stream de transmissão e dados de integridade de streaming, como a taxa de bits e de quadros. Os dados de integridade do stream são atualizados a cada 2 segundos. Por isso, não exceda essa frequência ao fazer consultas. Um tempo limite de stream será detectado e registrado após 4 segundos sem recebimento de dados.

Para ler um objeto LiveVideo, obtenha um token de acesso adequado de Usuário ou Página com a permissão publish_video e envie uma consulta para:

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

Use o parâmetro {fields} para especificar os campos do objeto LiveVideo que você quer retornar. Por exemplo, veja uma solicitação para receber o ingest_streams no objeto LiveVideo, que inclui dados sobre a integridade do stream:

Exemplo de solicitação

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();

Exemplo de resposta

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

Propriedades de resposta

Nome do campoDescrição
audio_bitrate

Bits por segundo do stream de áudio recebido.

is_master

true se o ID do vídeo ao vivo consultado for o vídeo exibido ao público.

secure_stream_url

A URL de ingestão RTMPS segura para o ID do vídeo ao vivo consultado.

stream_url

A URL de ingestão RTMP para o ID do vídeo ao vivo consultado.

video_bitrate

Bits por segundo do stream de vídeo recebido.

video_framerate

Quadros por segundo do stream de vídeo recebido.

video_gop_size

Tamanho do GOP (grupo de fotos) em milissegundos.

video_height

Altura em pixels do quadro de vídeo recebido.

video_width

Largura em pixels do quadro de vídeo recebido.

Finalizar uma transmissão

Para finalizar uma transmissão, interrompa o streaming de dados do vídeo ao vivo do codificador para a URL de stream ou envie uma solicitação para:

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

Isso define o status do objeto LiveVideo como VOD e o salva como um vídeo sob demanda (VOD) para que possa ser assistido mais tarde.

Se o processo for concluído, a API retornará o ID do objeto LiveVideo LiveVideo.

Exemplo de solicitação

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();

Exemplo de resposta

{
  "id": "10213570560993813"
}

É possível realizar uma operação GET no ID do LiveVideo para confirmar que o status dele foi definido como VOD:

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

Exemplo de resposta

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

Excluir uma transmissão

Para excluir uma transmissão que foi finalizada e salva como VOD, envie uma solicitação para:

DELETE /{live-video-id}

Exemplo de solicitação

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();

Exemplo de resposta

{
  success: true
}

Obter dados de código de erro

Para obter dados de código de erro associados à transmissão, envie uma solicitação para:

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

A API responderá com o error code, o type, a message e um timestamp.

Exemplo de resposta

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();

Exemplo de resposta

{ "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_subcodeResumo do erroDescrição
COPYRIGHT__LIVE_COPYRIGHT_VIOLATION

Violação de direitos autorais ao vivo

Seu vídeo ao vivo foi interrompido porque ele pode conter conteúdo de áudio ou imagens de propriedade de uma Página diferente.

VIDEO__CREATE_FAILED

Problema de carregamento

Ocorreu um problema, e seu vídeo não foi carregado. Tente novamente.

LIVE_VIDEO__DELETE_FAILED

Vídeo ao vivo não excluído

Ocorreu um problema, e não foi possível excluir seu vídeo ao vivo. Tente novamente.

LIVE_VIDEO__EDIT_API_NOT_ALLOWED

A edição por meio da API de Vídeo não é permitida durante transmissões ao vivo

Não é permitido editar um vídeo ao vivo usando a API de Edição de vídeo Use o ID de vídeo ao vivo.

LIVE_VIDEO__LIVE_STREAM_ERROR

Stream genérico

Houve um erro durante o stream

LIVE_VIDEO__NOT_EXIST

O vídeo ao vivo não existe

O vídeo ao vivo que você está tentando acessar não existe mais no sistema.

LIVE_VIDEO__PRIVACY_REQUIRED

Configuração de privacidade obrigatória

Você precisa configurar uma privacidade antes de transmitir o conteúdo ao vivo.