Publicar: Conceptos básicos
Esta guía cubre los pasos esenciales para publicar un flujo: crear un Publisher, iniciar el flujo en una sesión, detenerlo de forma segura y destruir los recursos cuando haya terminado.
Un objeto Editor se utiliza para capturar un flujo de audio y video desde el micrófono y la cámara de los sistemas para su uso en una sesión de Vonage Video.
También puede utilizar un Editor para publicar un compartir pantalla transmisión de vídeo.
Inicialización de un objeto editor
En OT.initPublisher() inicializa y devuelve un objeto Publisher. El objeto Publisher representa la vista de un vídeo que usted publica:
var publisher;
var targetElement = 'publisherContainer';
publisher = OT.initPublisher(targetElement, null, function(error) {
if (error) {
// The client cannot publish.
// You may want to notify the user.
} else {
console.log('Publisher initialized.');
}
});
En OT.initPublisher() recibe tres parámetros:
targetElement- (Opcional) Define el elemento DOM al que sustituye el vídeo del editor.properties- (Opcional) Conjunto de propiedades que personalizan el Editor. Enpropertiestambién incluye opciones para especificar un dispositivo de entrada de audio y vídeo utilizado por el editor. La direcciónpropertiestambién incluye opciones para personalizar el aspecto de la vista en la página HTML (véase Personalizar la interfaz de usuario) y seleccione si desea publicar audio y vídeo (véase Publicar sólo audio o vídeoPara más opciones de editor, consulte la documentación de la funciónpropertiesparámetro de la OT.initPublisher() método.completionHandler- (Opcional) Un controlador de finalización que especifica si el editor se ha instanciado correctamente o con un error.
Puede pasar este objeto Publisher a la función Session.publish() para publicar un flujo en una sesión.
Antes de llamar Session.publish()puede utilizar este objeto Publisher para probar el micrófono y la cámara conectados al Publisher.
En insertMode propiedad del properties del OT.initPublisher() especifica cómo se insertará el objeto Publisher en el DOM HTML, en relación con el método targetElement parámetro. Puede establecer este parámetro en uno de los siguientes valores:
"replace"- El objeto Publisher sustituye el contenido del targetElement. Este es el valor predeterminado."after"- El objeto Publisher es un nuevo elemento insertado después del targetElement en el DOM HTML. (Tanto el Publisher como el targetElement tienen el mismo elemento padre)."before"- El objeto Publisher es un nuevo elemento insertado antes del targetElement en el DOM HTML. (Tanto el Publisher como el targetElement tienen el mismo elemento padre)."append"- El objeto Publisher es un nuevo elemento que se añade como hijo del targetElement. Si hay otros elementos hijos, el Publisher se añade como último elemento hijo del targetElement.
Por ejemplo, el siguiente código añade un nuevo objeto Publisher como hijo de un objeto publisherContainer Elemento DOM:
// Try setting insertMode to other values: "replace", "after", or "before":
var publisherProperties = {insertMode: "append"};
var publisher = OT.initPublisher('publisherContainer', publisherProperties, function (error) {
if (error) {
console.log(error);
} else {
console.log("Publisher initialized.");
}
});
Para un editor básico, utilice la función Publisher.Builder para instanciar un objeto Publisher. Introduzca el contexto de la aplicación Android para el editor:
mPublisher = new Publisher.Builder(context)
.build();
Añade un objeto receptor para los eventos básicos relacionados con la publicación llamando a la función setPublisherListener(PublisherKit.PublisherListener listener) del objeto Editor:
mPublisher.setPublisherListener(this);
Implemente los métodos de la interfaz PublisherKit.PublisherListener en el objeto que especifique como objeto receptor de eventos. Estos métodos se ejecutan cuando se producen eventos relacionados con el editor.
En getView() del objeto Publisher devuelve la vista del vídeo que has publicado. Añádelo como subvista de un objeto android.view.ViewGroup para mostrarlo en la aplicación:
mPublisherViewContainer.addView(mPublisher.getView());
Pase el objeto Publisher a la función Session.publish() para publicar un flujo en una sesión.
Puede llamar a otros métodos del objeto Publisher.Builder para definir configuraciones personalizadas para el editor:
mPublisher = new Publisher.Builder(context)
.name("Bob")
.audioTrack(true)
.frameRate(CameraCaptureFrameRate.FPS_7)
.resolution(CameraCaptureResolution.LOW)
.videoTrack(false)
.capturer(mCapturer)
.renderer(mRenderer)
.build();
Tenga en cuenta que en las sesiones que utilizan el router de medios de vídeo de Vonage (sesiones con el modo multimedia enrutado), al reducir la frecuencia de imagen se reduce proporcionalmente el ancho de banda utilizado por el flujo. Sin embargo, en las sesiones que tienen el modo de medios establecido en retransmitido, la reducción de la frecuencia de imagen no reduce el ancho de banda del flujo.
Utilizar un capturador de vídeo personalizado
Puede utilizar un capturador de vídeo personalizado para publicar un flujo con una fuente de vídeo personalizada. También puede utilizar el capturador de vídeo personalizado para publicar un flujo de pantalla compartida.
También puede utilizar una fuente de audio personalizada para el flujo publicado - véase Uso de un controlador de audio personalizado.
Utilice la OTPublisher para crear un editor. La dirección view del objeto contiene la vista del vídeo que publica:
let publisher = OTPublisher(delegate: self, settings: OTPublisherSettings())!
if let publisherView = publisher.view {
self.view.addSubview(publisherView)
publisherView.frame = CGRect(x: 0, y: 0, width: 200, height: 150)
}
Implementa los métodos del protocolo OTPublisherDelegate en el objeto que especifiques como objeto delegado. Estos métodos se llaman cuando se producen eventos relacionados con el editor.
Pase el objeto Publisher a la función OTSession publish(_:error:) para publicar un flujo en una sesión.
Puede establecer otras propiedades del objeto OTPublisherSettings para definir configuraciones personalizadas para el editor:
let publisherSettings = OTPublisherSettings()
publisherSettings.name = "Bob's video"
publisherSettings.audioTrack = false
publisherSettings.videoTrack = true
publisherSettings.cameraResolution = .high
publisherSettings.cameraFrameRate = .rate30FPS
let publisher = OTPublisher(delegate: self, settings: publisherSettings)!
Tenga en cuenta que en las sesiones que utilizan el router de medios de vídeo de Vonage (sesiones con el modo multimedia enrutado), al reducir la frecuencia de imagen se reduce proporcionalmente el ancho de banda utilizado por el flujo. Sin embargo, en las sesiones que tienen el modo de medios establecido en retransmitido, la reducción de la frecuencia de imagen no reduce el ancho de banda del flujo.
Puede utilizar un capturador de vídeo personalizado para publicar un flujo con una fuente de vídeo personalizada - véase Utilizar un capturador de vídeo personalizado. También puede utilizar el capturador de vídeo personalizado para publicar un flujo de pantalla compartida - ver Compartir pantalla.
También puede utilizar una fuente de audio personalizada para el flujo publicado - véase Uso de un controlador de audio personalizado.
Utilice la OTPublisher para crear un editor. La dirección view del objeto contiene la vista del vídeo que publica:
OTPublisher publisher = [[OTPublisher alloc]
initWithDelegate:self
settings:[[OTPublisherSettings alloc] init]];
[self.view addSubview:publisher.view];
[publisher.view setFrame:CGRectMake(0, 0, 200, 150)];
Implementa los métodos del protocolo OTPublisherDelegate en el objeto que especifiques como objeto delegado. Estos métodos se llaman cuando se producen eventos relacionados con el editor.
Pase el objeto Publisher a la función [OTSession publish:error] para publicar un flujo en una sesión.
Puede establecer otras propiedades del objeto OTPublisherSettings para definir configuraciones personalizadas para el editor:
OTPublisherSettings *_publisherSettings = [[OTPublisherSettings alloc] init];
_publisherSettings.name = @"Bob's video";
_publisherSettings.audioTrack = NO;
_publisherSettings.videoTrack = YES;
_publisherSettings.cameraResolution = OTCameraCaptureResolutionHigh;
_publisherSettings.cameraFrameRate = OTCameraCaptureFrameRate30FPS;
_publisher = [[OTPublisher alloc]
initWithDelegate:self
settings:_publisherSettings];
Tenga en cuenta que en las sesiones que utilizan el router de medios de vídeo de Vonage (sesiones con el modo multimedia enrutado), al reducir la frecuencia de imagen se reduce proporcionalmente el ancho de banda utilizado por el flujo. Sin embargo, en las sesiones que tienen el modo de medios establecido en retransmitido, la reducción de la frecuencia de imagen no reduce el ancho de banda del flujo.
Puede utilizar un capturador de vídeo personalizado para publicar un flujo con una fuente de vídeo personalizada - véase Utilizar un capturador de vídeo personalizado.
También puede utilizar el capturador de vídeo personalizado para publicar un flujo de pantalla compartida - ver Compartir pantalla.
También puede utilizar una fuente de audio personalizada para el flujo publicado - véase Uso de un controlador de audio personalizado.
Puede crear un Publisher básico llamando a la función Publisher() pasando la instancia de la aplicación Windows:
publisher = new Publisher(Context.Instance);
publisher.Error += Publisher_Error;
private void Publisher_Error(object sender, Publsher.ErrorEventArgs e)
{
Console.WriteLine("Publisher error:" + e.ErrorCode);
}
Pase el objeto Publisher a la función Session.publish() para publicar un flujo en una sesión.
De manera predeterminada, el editor utiliza el capturador de video predeterminado, que utiliza el micrófono y la cámara predeterminados del sistema como fuente de audio y video para la transmisión publicada. Esto se define mediante VideoCapturer en el SDK de video de Vonage.
Puede definir un objeto capturador de vídeo específico para que lo utilice el editor. Este objeto captura vídeo de una fuente de vídeo (como una cámara) y tiene ajustes para el vídeo (como la frecuencia de imagen y la resolución).
Puede utilizar la función VideoCapturer.EnumerateDevices() para enumerar los dispositivos de captura de vídeo (cámaras) del sistema. Esto devuelve una lista de objetos VideoDevice. La clase VideoDevice incluye una serie de objetos CreateVideoCapturer() para instanciar un objeto VideoCapturer que utilice el dispositivo de vídeo:
VideoCapturer.CreateVideoCapturer(format)- Crea un objeto VideoCapturer utilizando la configuración definida por un objeto VideoFormat.VideoCapturer.CreateVideoCapturer(width, height, fps)- Crea un objeto VideoCapturer con la resolución definida por la directivawidthyheighty con la frecuencia de imagen definida porfpsparámetro.VideoCapturer.CreateVideoCapturer(resolution, fps)- Crea un objeto VideoCapturer con la resolución definida por la directivaresolutiony con la frecuencia de imagen definida por el parámetrofpsparámetro. La direcciónOpenTok.VideoCapturer.Resolutiondefine los valores utilizados por elresolutionparámetro:Low(320x240 píxeles),Medium(640x480 píxeles), yHigh(1280x720 píxeles), yHigh 1080p(1920x1080 píxeles).
El capturador de vídeo utiliza la resolución soportada en el sistema más cercana a la resolución que especifiques.
Por defecto, los editores utilizan un renderizador de video predeterminado para Windows Presentation Foundation, que está definido por la clase VideoRenderer en el SDK de Vonage Video Windows. También puedes especificar un renderizador para el video creando una clase que implemente la interfaz IVideoRenderer. Puedes usar un renderizador de video personalizado - ver Uso de un renderizador de vídeo personalizado.
El siguiente código crea un Publisher que utiliza el capturador de vídeo por defecto del sistema con la resolución ajustada a 720p (VideoCapturer.Resolution.High) y la frecuencia de imagen fijada en 30 fotogramas por segundo:
var devices = VideoCapturer.EnumerateDevices();
var selectedDevice = devices[0];
capturer = selectedDevice.CreateVideoCapturer(VideoCapturer.Resolution.High,
VideoCapturer.VideoCapturer.FrameRate.Fps30);
publisher = new Publisher(Context.Instance, renderer: publisherVideoRenderer, capturer: capturer);
publisher.Error += Publisher_Error;
private void Publisher_Error(object sender, Publsher.ErrorEventArgs e)
{
Console.WriteLine("Publisher error:" + e.ErrorCode);
}
Nota: En las sesiones que utilizan el router de medios de vídeo de Vonage (sesiones con el modo multimedia enrutado), al reducir la frecuencia de imagen se reduce proporcionalmente el ancho de banda utilizado por el flujo. Sin embargo, en las sesiones que tienen el modo de medios establecido en retransmitido, la reducción de la frecuencia de imagen no reduce el ancho de banda del flujo.
Puede pasar otros parámetros opcionales del Publisher() para definir ajustes personalizados para el flujo publicado:
name- El nombre del vídeo del editor. ElStream.Namede un flujo publicado por este editor se establecerá en este valor (en todos los clientes).hasAudioTrack- Si se incluye una pista de audio en el flujo publicado. El valor predeterminado estrue.hasVideoTrack- Si se incluye una pista de audio en el flujo publicado. El valor predeterminado estrue.stereo- Si se activa el audio estéreo en el flujo publicado. El valor predeterminado esfalse. Ajústelo atruepara publicar el audio de un micrófono estéreo.
También puede cambiar la fuente de audio utilizada por el editor. O puede crear un controlador de audio personalizado para uso de todos los editores y abonados.
Puede utilizar un capturador de vídeo personalizado para publicar un flujo con una fuente de vídeo personalizada - véase Utilizar un capturador de vídeo personalizado.
También puede utilizar el capturador de vídeo personalizado para publicar un flujo de pantalla compartida - ver Compartir pantalla.
Nota: La clase OpenTok.Publisher y OpenTok.VideoCapturer implementan la interfaz System.IDisposable. Asegúrese de llamar a la clase Dispose() de estos objetos para liberar sus recursos cuando ya no necesites el objeto (por ejemplo, cuando se elimina el Editor o cuando se cierra la aplicación o la ventana).
Comience por crear una estructura de tipo otc_publisher_callbacks:
char *publisher_user_data = strdup("Publisher user data");
static void on_publisher_stream_created(otc_publisher *publisher,
void *user_data,
const otc_stream *stream) {
// The stream has been created.
}
static void on_publisher_render_frame(otc_publisher *publisher,
void *user_data,
const otc_video_frame *frame) {
// You can render the frame to the UI.
}
static void on_publisher_stream_destroyed(otc_publisher *publisher,
void *user_data,
const otc_stream *stream) {
// The stream has been destroyed.
}
static void on_publisher_error(otc_publisher *publisher,
void *user_data,
const char* error_string,
enum otc_publisher_error_code error_code) {
// Handle the error.
}
struct otc_publisher_callbacks publisher_callbacks = {0};
publisher_callbacks.user_data = publisher_user_data;
publisher_callbacks.on_stream_created = on_publisher_stream_created;
publisher_callbacks.on_render_frame = on_publisher_render_frame;
publisher_callbacks.on_stream_destroyed = on_publisher_stream_destroyed;
publisher_callbacks.on_error = on_publisher_error;
Utiliza el user_data miembro de la otc_publisher_callbacks para establecer los datos a los que quieras hacer referencia en las funciones callback. En este ejemplo, lo establecemos como un puntero a un array char. Pero podría ser un puntero a una instancia de algún otro tipo que contenga información significativa.
Los demás miembros de la otc_publisher_callbacks son funciones de devolución de llamada que se invocan cuando se producen eventos relacionados con el flujo publicado:
on_stream_created- Se ejecuta cuando el editor comienza a transmitir a la sesión.on_render_frame- Se llama cada vez que el editor está listo para renderizar un nuevo fotograma de vídeo en la secuencia.on_stream_destroyed- Llamada cuando se destruye el flujo del editor.on_error- Llamada cuando se produce un error al publicar el flujo.
Todas las devoluciones de llamada no se realizarán en la aplicación ni en el hilo principal, sino en un hilo interno. La aplicación debe devolver la devolución de llamada lo antes posible para evitar el bloqueo del hilo interno.
Véase otc_publisher_callbacks en la referencia OpenTok Linux SDK para más detalles sobre cada una de las funciones de callback.
Llame al otc_publisher_new() para crear un otc_publisher que representa al editor de OpenTok:
publisher = otc_publisher_new("Bob's video",
NULL, /* Use the system camera. */
&publisher_callbacks);
if (publisher == NULL) {
printf("Could not create OpenTok publisher successfully");
otc_session_delete(session);
otc_destroy();
return EXIT_FAILURE;
}
En otc_publisher_new() recibe tres argumentos:
name- Un nombre (opcional) que identifica al editor del flujo.capturer- Utilice este parámetro si desea proporcionar un capturador de vídeo personalizado. Si se establece enNULLel editor utiliza la cámara predeterminada del sistema como fuente de vídeo.
Véase Utilizar un capturador de vídeo personalizado para ver cómo implementar un capturador de vídeo personalizado.
callbacks- Laotc_publisher_callbacksestructura de devolución de llamada del editor, descrita anteriormente.
Crear un controlador de audio personalizado para uso de todos los editores y abonados.
Puede utilizar un capturador de vídeo personalizado para publicar un flujo con una fuente de vídeo personalizada - véase Utilizar un capturador de vídeo personalizado.
Publicar un flujo
Una vez que tenga un objeto Publisher y un sesiónEl siguiente paso es pasarlo al objeto de sesión para iniciar la transmisión.
Para publicar un flujo, añada un componente OTPublisher como hijo del objeto OTSession:
<OTSession
applicationId="your-application-id"
sessionId="the session ID"
token="the token">
<OTPublisher/>
</OTSession>
El publicador inicia el streaming cuando el cliente se conecta a la sesión. El objeto OTPublisher envía un streamCreated cuando comienza a transmitir a la sesión. Envía un evento error si hay un evento error editorial. Establecer un eventHandlers del componente OTPublisher, y establezca la propiedad streamCreated y error de ese objeto a funciones de devolución de llamada:
<OTPublisher
eventHandlers={{
streamCreated: () => {
console.log('The publisher started streaming.');
},
error: event => {
console.log('Publisher error:', event);
},
}}/>
Pasar el objeto editor a publish() de un objeto Session para publicar un flujo en la sesión:
publisher = OT.initPublisher('replacementElementId');
session.publish(publisher, function(error) {
if (error) {
console.log(error);
} else {
console.log('Publishing a stream.');
}
});
El segundo parámetro es una función de gestión de finalización a la que se pasa un objeto de error si falla la publicación. En caso contrario, se llama a la función de finalización sin pasarle ningún error.
Este código supone que session es un objeto Session, y que el cliente se ha conectado a la sesión. Para más información, véase Unirse a una sesión.
El objeto Publish envía un streamCreated cuando comience a transmitirse a la sesión:
var publisher = OT.initPublisher();
session.publish(publisher, function(error) {
if (error) {
console.log(error);
} else {
console.log('Publishing a stream.');
}
});
publisher.on('streamCreated', function (event) {
console.log('The publisher started streaming.');
});
El objeto Publisher tiene un element que se establece en el elemento HTML DOM que lo contiene.
Puede establecer la tasa de bits máxima para un flujo publicado. Establecer la bitrate máximo puede ayudar a reducir el consumo de ancho de banda cuando un usuario está se conecta desde una conexión con contador. Consulte esta documentación.
Pasar el objeto editor a publish(PublisherKit publisher) de un objeto Session para publicar el flujo en la sesión:
mSession.publish(mPublisher);
Este código supone que mSession es un objeto Session, y que el cliente se ha conectado a la sesión. Para más información, véase Unirse a una sesión.
En PublisherKit.PublisherListener.onStreamCreated(PublisherKit publisher, Stream stream) se llama cuando el editor comienza a transmitir a la sesión:
@Override
public void onStreamCreated(publisher, stream) {
// The publisher started streaming.
}
Puede establecer la tasa de bits máxima para un flujo publicado. Establecer la bitrate máximo puede ayudar a reducir el consumo de ancho de banda cuando un usuario está se conecta desde una conexión con contador. Consulte esta documentación.
Pasar el objeto editor a OTSession publish(_:error:) de un objeto OTSession para publicar el flujo en la sesión:
var error: OTError?
session.publish(publisher, error: &error)
if let error = error {
print("publishing failed with error: \(error)");
}
Este código supone que session es un objeto Session, y que el cliente se ha conectado a la sesión. Para más información, véase Unirse a una sesión.
En OTPublisherDelegate publisher(_:streamCreated:) se envía cuando el editor comienza a transmitir a la sesión.
Pasar el objeto editor a [OTSession publish:error] de un objeto OTSession para publicar el flujo en la sesión:
OTError* error = nil;
[session publish:publisher error:&error];
if (error) {
NSLog(@"publishing failed with error: (%@)", error);
}
Este código supone que session es un objeto Session, y que el cliente se ha conectado a la sesión. Para más información, véase Crear una sesión.
En [OTPublisherDelegate publisher:streamCreated:] se envía cuando el editor comienza a transmitir a la sesión.
Puede establecer la tasa de bits máxima para un flujo publicado. Establecer la bitrate máximo puede ayudar a reducir el consumo de ancho de banda cuando un usuario está se conecta desde una conexión con contador. Consulte esta documentación.
Pasar el objeto editor a Publish(publisher) de un objeto Session para publicar el flujo en la sesión:
session.Publish(publisher);
Este código supone que session es un objeto Session, que publisher es un objeto Publisher y que el cliente se ha conectado a la sesión. Para más información, véase Unirse a una sesión.
En Publisher envía el StreamCreated cuando el editor comienza a transmitir a la sesión:
publisher.StreamCreated += Publisher_StreamCreated;
session.Publish(publisher);
private void Publisher_StreamCreated(object sender, Publisher.StreamEventArgs e)
{
Console.WriteLine("The publisher started streaming.");
}
Puede establecer la tasa de bits máxima para un flujo publicado. Establecer la bitrate máximo puede ayudar a reducir el consumo de ancho de banda cuando un usuario está se conecta desde una conexión con contador. Consulte esta documentación.
Cuando la aplicación se conecta a una sesión, el icono on_connected() de la función otc_session_callbacks (véase Unirse a una sesión). En respuesta a esto, puede llamar a la función otc_session_publish() para publicar un flujo en la sesión de OpenTok:
if (otc_session_publish(session, publisher) != OTC_SUCCESS) {
printf("Could not publish successfully.");
}
En otc_session_publish() toma dos argumentos:
- El puntero a la
otc_sessionestructura. - En
otc_publisherestructura.
Devuelve OTC_SUCCESS cuando se inicia con éxito la publicación de un flujo en la sesión. O devuelve un error, y el otc_error .
Puede establecer la tasa de bits máxima para un flujo publicado. Establecer la bitrate máximo puede ayudar a reducir el consumo de ancho de banda cuando un usuario está se conecta desde una conexión con contador. Consulte esta documentación.
Establecer una preferencia de degradación del editor
Cuando el ancho de banda o la CPU son limitados, el motor de vídeo puede reducir la frecuencia de imagen y/o la resolución del vídeo del editor para ajustarse a las limitaciones.
La preferencia de degradación es un ajuste de configuración que permite modificar este comportamiento.
Los desarrolladores son responsables de definir y aplicar las preferencias de degradación en función de sus casos de uso y requisitos.
Funciona como una preferencia, lo que significa que el motor de vídeo intentará seguir la preferencia seleccionada, pero no hay garantías sobre el resultado.
Esta preferencia puede comportarse de forma diferente cuando se utiliza vídeo escalabledonde el motor de vídeo puede decidir eliminar capas en lugar de degradar la resolución.
Sugerencia de contenido y la preferencia de degradación sirven a propósitos diferentes pero relacionados: La sugerencia de contenido describe el tipo de contenido que se transmite, mientras que la preferencia de degradación controla la estrategia de codificación. Al definir una sugerencia de contenido, el motor de vídeo determina automáticamente la preferencia de degradación adecuada (por ejemplo, "texto" selecciona automáticamente mantener la resolución). Una preferencia de degradación establecida explícitamente anulará esta selección automática.
Setting the degradation preference
Para establecer la preferencia de degradación del editor, utilice publisher.setDegradationPreference con cualquiera de las opciones disponibles en DegradationPreference:
publisher.setDegradationPreference(DegradationPreference.DegradationPreferenceMaintainResolution);
Los siguientes DegradationPreference están disponibles:
DegradationPreferenceNotSet: El valor por defecto. El motor de vídeo decidirá la preferencia de degradación óptima.DegradationPreferenceMaintainFrameRateAndResolution: El motor de vídeo intentará mantener constante la frecuencia de imagen y no reducir la resolución.DegradationPreferenceMaintainFrameRate: El motor de vídeo intentará mantener constante la frecuencia de imagen, pero puede reducir la resolución si es necesario.DegradationPreferenceMaintainResolution: El motor de vídeo no reducirá la resolución, pero puede reducir la frecuencia de imagen si es necesario.DegradationPreferenceBalanced: El motor de vídeo intentará alcanzar un equilibrio entre la reducción de la resolución y la velocidad de fotogramas cuando sea necesario.
Getting the current degradation preference
Para recuperar la preferencia de degradación del editor actualmente configurada, utilice publisher.getDegradationPreference:
DegradationPreference preference = publisher.getDegradationPreference();
Setting the degradation preference
Para establecer la preferencia de degradación del editor, establezca publisher.degradationPreference a cualquiera de las opciones disponibles en OTDegradationPreference:
publisher.degradationPreference = .maintainResolution
Los siguientes OTDegradationPreference están disponibles:
notSet: El valor por defecto. El motor de vídeo decidirá la preferencia de degradación óptima.maintainFrameRateAndResolution: El motor de vídeo intentará mantener constante la frecuencia de imagen y no reducir la resolución.maintainFrameRate: El motor de vídeo intentará mantener constante la frecuencia de imagen, pero puede reducir la resolución si es necesario.maintainResolution: El motor de vídeo no reducirá la resolución, pero puede reducir la frecuencia de imagen si es necesario.balanced: El motor de vídeo intentará alcanzar un equilibrio entre la reducción de la resolución y la velocidad de fotogramas cuando sea necesario.
Getting the current degradation preference
Para recuperar la preferencia de degradación del editor actualmente configurada, lea publisher.degradationPreference propiedad:
let preference = publisher.degradationPreference;
Setting the degradation preference
Para establecer la preferencia de degradación del editor, establezca publisher.degradationPreference a cualquiera de las opciones disponibles en OTDegradationPreference:
publisher.degradationPreference = OTDegradationPreferenceMaintainResolution;
Los siguientes OTDegradationPreference están disponibles:
OTDegradationPreferenceNotSet: El valor por defecto. El motor de vídeo decidirá la preferencia de degradación óptima.OTDegradationPreferenceMaintainFrameRateAndResolution: El motor de vídeo intentará mantener constante la frecuencia de imagen y no reducir la resolución.OTDegradationPreferenceMaintainFrameRate: El motor de vídeo intentará mantener constante la frecuencia de imagen, pero puede reducir la resolución si es necesario.OTDegradationPreferenceMaintainResolution: El motor de vídeo no reducirá la resolución, pero puede reducir la frecuencia de imagen si es necesario.OTDegradationPreferenceBalanced: El motor de vídeo intentará alcanzar un equilibrio entre la reducción de la resolución y la velocidad de fotogramas cuando sea necesario.
Getting the current degradation preference
Para recuperar la preferencia de degradación del editor actualmente configurada, lea publisher.degradationPreference propiedad:
OTDegradationPreference preference = publisher.degradationPreference;
Setting the degradation preference
Para establecer la preferencia de degradación del editor, establezca publisher.DegradationPreference a cualquiera de las opciones disponibles en DegradationPreference:
publisher.DegradationPreference = DegradationPreference.MaintainResolution;
Los siguientes DegradationPreference están disponibles:
NotSet: El valor por defecto. El motor de vídeo decidirá la preferencia de degradación óptima.MaintainFrameRateAndResolution: El motor de vídeo intentará mantener constante la frecuencia de imagen y no reducir la resolución.MaintainFrameRate: El motor de vídeo intentará mantener constante la frecuencia de imagen, pero puede reducir la resolución si es necesario.MaintainResolution: El motor de vídeo no reducirá la resolución, pero puede reducir la frecuencia de imagen si es necesario.Balanced: El motor de vídeo intentará alcanzar un equilibrio entre la reducción de la resolución y la velocidad de fotogramas cuando sea necesario.
Getting the current degradation preference
Para recuperar la preferencia de degradación del editor actualmente configurada, lea publisher.DegradationPreference propiedad:
DegradationPreference preference = publisher.DegradationPreference;
Setting the degradation preference
Para establecer la preferencia de degradación del editor, utilice otc_publisher_set_degradation_preference con cualquiera de las opciones disponibles en otc_degradation_preference:
otc_publisher_set_degradation_preference(publisher, OTC_DEGRADATION_PREFERENCE_MAINTAIN_RESOLUTION);
Los siguientes otc_degradation_preference están disponibles:
OTC_DEGRADATION_PREFERENCE_NOT_SET: El valor por defecto. El motor de vídeo decidirá la preferencia de degradación óptima.OTC_DEGRADATION_PREFERENCE_MAINTAIN_FRAMERATE_AND_RESOLUTION: El motor de vídeo intentará mantener constante la frecuencia de imagen y no reducir la resolución.OTC_DEGRADATION_PREFERENCE_MAINTAIN_FRAMERATE: El motor de vídeo intentará mantener constante la frecuencia de imagen, pero puede reducir la resolución si es necesario.OTC_DEGRADATION_PREFERENCE_MAINTAIN_RESOLUTION: El motor de vídeo no reducirá la resolución, pero puede reducir la frecuencia de imagen si es necesario.OTC_DEGRADATION_PREFERENCE_BALANCED: El motor de vídeo intentará alcanzar un equilibrio entre la reducción de la resolución y la velocidad de fotogramas cuando sea necesario.
Getting the current degradation preference
Para recuperar la preferencia de degradación del editor actualmente configurada, utilice otc_publisher_get_degradation_preference:
otc_degradation_preference preference = otc_publisher_get_degradation_preference(publisher);
Impedir que un editor retransmita
Controle quién puede publicar e impida que un editor transmita a una sesión cuando sea necesario.
Puede hacer que el editor deje de transmitir a la sesión desmontándolo (eliminándolo del componente OTSession padre). Por ejemplo, el siguiente código detiene la publicación de un flujo después de 30 segundos:
import React, {Component} from 'react';
import {View} from 'react-native';
import {OTSession, OTPublisher} from 'opentok-react-native';
class App extends Component {
constructor(props) {
super(props);
this.apiKey = 'your-api-key';
this.sessionId = 'valid-session-id';
this.token = 'valid-token';
this.publisherOptions = {
publishCaptions: true,
publishVideo: true,
publishAudio: false,
};
this.state = {
publishing: true,
};
this.publisherEventHandlers = {
streamCreated: event => {
setTimeout(
function () {
console.log(10);
this.setState({publishing: false});
}.bind(this),
10000,
);
},
};
}
render() {
return (
<View>
<OTSession
applicationId={this.apiKey}
sessionId={this.sessionId}
token={this.token}
{this.state.publishing ? (
<OTPublisher
eventHandlers={this.publisherEventHandlers}
ref={instance => {
this.publisher = instance;
}}
/>
) : null}
</OTSession>
</View>
);
}
}
export default App;
Tenga en cuenta que puede detener individualmente el envío de vídeo o audio (sin dejar de publicar).
Detectar cuándo un flujo publicado abandona una sesión
El objeto OTPublisher envía un streamDestroyed cuando deja de transmitir a la sesión:
<OTPublisher
eventHandlers={{
streamDestroyed: function() {
console.log('The publisher stopped streaming.');
},
}}
/>
Para detener un editor, llame al botón unpublish() del objeto Session:
session.unpublish(publisher);
Tenga en cuenta que puede detener individualmente el envío de vídeo o audio (sin dejar de publicar).
Para más información, consulte Ajuste de audio y vídeo.
Detectar cuándo un flujo publicado abandona una sesión
El objeto Publisher envía un streamDestroyed cuando deja de transmitir a la sesión:
var publisher = OT.initPublisher();
session.publish(publisher);
publisher.on("streamDestroyed", function (event) {
console.log("The publisher stopped streaming. Reason: "
+ event.reason);
});
En streamDestroyed está definido por la clase StreamEvent. El evento incluye un reason que detalla por qué ha finalizado el flujo. Estas razones incluyen "clientDisconnected", "forceDisconnected", "forceUnpublished"o "networkDisconnected". Para más detalles, véase StreamEvent.
Por defecto, cuando un editor envía el comando streamDestroyed el editor se destruye y se elimina del DOM HTML. Puede evitar este comportamiento por defecto llamando a la función preventDefault() del objeto StreamEvent:
publisher.on("streamDestroyed", function (event) {
event.preventDefault();
console.log("The publisher stopped streaming.");
});
Es posible que desee evitar el comportamiento predeterminado y conservar el Editor si desea reutilizar el objeto Editor para publicar de nuevo en la sesión.
La editorial también envía un destroyed cuando el objeto ha sido eliminado del DOM HTML. En respuesta a este evento, puede optar por ajustar (o eliminar) los elementos DOM relacionados con el editor que se ha eliminado.
Para detener un editor, llame al botón unpublish(PublisherKit publisher) del objeto Session:
mSession.unpublish(mPublisher);
En PublisherKit.PublisherListener.onStreamDestroyed(PublisherKit publisher, Stream stream) cuando el editor deja de transmitir a la sesión:
@Override
public void onStreamDestroyed(publisher, stream) {
// The publisher stopped streaming.
}
Para detener un editor, llame al botón OTSession unpublish(_:error:) del objeto OTSession:
var error: OTError?
session.unpublish(publisher, error: &error)
if let error = error {
print("unpublishing failed with error: \(error)");
}
En OTPublisherDelegate publisher(_:streamDestroyed:) se envía cuando el editor deja de transmitir a la sesión. Cuando se envía este mensaje, elimina la vista del editor de su supervista:
publisher.view?.removeFromSuperview();
Para detener un editor, llame al botón [OTSession unpublish:error:] del objeto OTSession:
OTError* error = nil;
[session unpublish:publisher error:&error];
if (error) {
NSLog(@"publishing failed with error: (%@)", error);
}
En [OTPublisherDelegate publisher:streamDestroyed:] se envía cuando el editor deja de transmitir a la sesión. Cuando se envía este mensaje, elimina la vista del editor de su supervista:
[publisher.view removeFromSuperview:];
Para detener un editor, llame al botón Unpublish(publisher) del objeto Session:
session.unpublish(mPublisher);
En Publisher envía el StreamCreated cuando el editor comienza a transmitir a la sesión:
publisher.StreamCreated += Publisher_StreamDestroyed;
session.Publish(publisher);
private void Publisher_StreamDestroyed(object sender, Publisher.StreamEventArgs e)
{
Console.WriteLine("The publisher stopped streaming.");
}
Llame al otc_session_unpublish() pasando la función otc_session y otc_publisher structs:
otc_status status = otc_session_unpublish(session, publisher);
if (status == OTC_SUCCESS) {
printf("Unpublished successfully.");
} else {
printf("Could not unpublish.");
}
Eliminar un editor (limpieza)
Puede eliminar un editor llamando a su destroy() método. Llamada a destroy() borra el objeto Publisher y lo elimina del DOM HTML:
publisher.destroy();