silverlight - para - IIS Suave transmisión de baja calidad en el inicio
silverlight offline (4)
Estoy alojando algunos videos de streaming adaptables en Windows Azure y me he dado cuenta de que al principio el video comienza con la tasa de bits más baja disponible. Ese es un gran problema.
He visto buscando en Internet que se puede hacer un truco conectando el evento manifesteady y eliminando los bitrates más bajos y luego volviéndolos a agregar después de un tiempo. Tiene sentido pero no he visto ningún código de muestra para hacer eso.
Obtuve el código de jugador del codificador de expresión 4 y eché un vistazo pero no encontré dónde hacer el cambio.
¿Alguien tiene más información sobre cómo mejorar el inicio para una transmisión fluida?
Muchas gracias
Como la otra respuesta mencionada, use MMPPF (previamente Silverlight Media Framework). Mucho más jugador con todas las funciones y relativamente fácil de personalizar (con video tutoriales también).
Para la velocidad de bits, sí, el algoritmo Smooth Streaming está diseñado para el inicio de latencia más bajo posible, por lo tanto, el bitrate / video más bajo se usa al inicio. Sin embargo, es posible hacer lo que quieras.
Necesitarás hacer 2 cosas, primero:
Agregue un controlador al evento OnMediaPluginRegistered
del jugador. En ese caso, verifique si es un IAdaptiveMediaPlugin
; necesitará la instancia de ese complemento. Aquí hay una muestra ...
IAdaptiveMediaPlugin _adaptivePlugin = null;
void OnMediaPluginRegistered(object sender, Microsoft.SilverlightMediaFramework.Core.CustomEventArgs<Microsoft.SilverlightMediaFramework.Plugins.IMediaPlugin> e)
{
var adaptivePlugin = e.Value as IAdaptiveMediaPlugin;
if (adaptivePlugin == null) { return; }
if (_adaptivePlugin == null)
{
_adaptivePlugin = adaptivePlugin;
}
}
Una vez que tenga eso, espere a que se abra uno de los eventos multimedia (MediaOpened o algo así), y ahora tendrá acceso a un método en IAdaptiveMediaPlugin
llamado SetVideoBitrateRange(...)
.
Por ejemplo:
_adaptivePlugin.SetVideoBitrateRange(minBitrate, maxBitrate, true);
Eso debería darte lo que necesitas.
Intente utilizar Microsoft Media Platform: Player Framework en lugar de Expression Encoder Player: tiene una lógica más avanzada.
Hola, publiqué la pregunta en el foro de Media Platform Player y obtuve una respuesta que funciona.
La discusión está aquí: http://smf.codeplex.com/discussions/271042
Aquí está el código que uso:
public MainPage() {
InitializeComponent();
player.MediaPluginRegistered += new EventHandler<CustomEventArgs<IMediaPlugin>>(player_MediaPluginRegistered);
player.PlayStateChanged += new EventHandler<CustomEventArgs<MediaPluginState>>(Player_PlayStateChanged);
}
private IAdaptiveMediaPlugin _adaptivePlugin = null;
private bool isStartupHeuristicsActive = false;
void player_MediaPluginRegistered(object sender, CustomEventArgs<IMediaPlugin> e) {
var adaptivePlugin = e.Value as IAdaptiveMediaPlugin;
if (adaptivePlugin == null) return;
if (_adaptivePlugin == null) _adaptivePlugin = adaptivePlugin;
_adaptivePlugin.ManifestReady +=new Action<IAdaptiveMediaPlugin>(_adaptivePlugin_ManifestReady);
}
void _adaptivePlugin_ManifestReady(IAdaptiveMediaPlugin obj)
{
if (_adaptivePlugin != null)
{
var videoStream = _adaptivePlugin.CurrentSegment.SelectedStreams.Where(i => i.Type == StreamType.Video).FirstOrDefault();
if (videoStream != null)
{
var averageBitrate = videoStream.AvailableTracks.Average(t => t.Bitrate);
var track = videoStream.AvailableTracks.FirstOrDefault(t => t.Bitrate >= averageBitrate);
if (track != null)
{
isStartupHeuristicsActive = true;
videoStream.SetSelectedTracks(new[] { track });
}
}
}
}
private void Player_PlayStateChanged(object sender, CustomEventArgs<MediaPluginState> e)
{
if (isStartupHeuristicsActive && e.Value == MediaPluginState.Playing)
{
isStartupHeuristicsActive = false;
if (_adaptivePlugin != null)
{
var videoStream = _adaptivePlugin.CurrentSegment.SelectedStreams.Where(i => i.Type == StreamType.Video).FirstOrDefault();
if (videoStream != null)
{
videoStream.SetSelectedTracks(videoStream.AvailableTracks);
}
}
}
}
Gracias
puede eliminar las secuencias adicionales (las de baja calidad) del lado del servidor, ya sea manualmente (necesita editar los archivos xml allí, no solo eliminar los archivos continuos físicos) o usar IIS, lo que proporciona la posibilidad de editar flujos continuos (suponiendo que instaló la extensión respectiva, digamos a través de la aplicación de instalación de Microsoft Platform). También puede usar WinMerge o una herramienta similar para comparar una copia de la carpeta del clip que tenía antes de usar la herramienta MS para ver qué cambia cuando elimina una (sub) transmisión específica de una transmisión fluida (compare la versión anterior y la nueva archivos .ism *)
eso también es útil porque a veces el jugador subestima la CPU y el ancho de banda del cliente (hay algunas versiones personalizadas disponibles que se supone arreglan el problema de la heurística de la CPU, al tener un archivo de configuración pre-editado apropiadamente). Es decir, si tiene algún screencast, a veces el cliente no obtiene la calidad suficiente para leer el texto, por lo que debe eliminar las (sub) secuencias de menor calidad y luego se reproduce bien (comienza a eliminar las inferiores y luego ve uno muestra OK). También puede configurar el TransformManager (o su código que llama a la funcionalidad respectiva) para no crear versiones de muy baja calidad.