significado meaning has example error android video-streaming http-live-streaming

meaning - Android HLS Streaming-Diferentes versiones de Android cargan diferentes ubicaciones en Stream



mpeg dash (4)

¿Intentaste darle al jugador un parámetro de inicio en la URL?

Me gusta esto:

" http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8?start=0 "

Me doy cuenta de que hay algunos problemas en cuanto al nivel de soporte de HLS en Android. Estoy tratando de escribir una pequeña demostración de videoplayer (para trabajar en tantos dispositivos como sea posible); preferiblemente sin utilizar una biblioteca de terceros; que puede transmitir vídeo HLS.

NOTA : Actualmente estoy probando en JellyBean 4.2.2, pero tengo acceso a otras versiones

Logré usar la clase MediaPlayer para que mi aplicación pueda comenzar a reproducir una transmisión (por ejemplo, el video de prueba de Apple BipBopAll ), pero parece estar cargando la sección incorrecta de la transmisión, ya que el video parece comenzar a los 29 minutos. (y así termina después de unos treinta segundos).

El código que he usado es bastante básico:

private void playTrack() { player = new MediaPlayer(); try { player.setDisplay(holder); player.setDataSource("http://devimages.apple.com/iphone/samples/bipbop /bipbopall.m3u8"); player.prepare(); } catch (...) { } player.start(); }

Actualización: he probado el mismo código en ICS 4.0.4 y funciona correctamente. Las pruebas en 3.0.1, cargan el flujo a los 15 minutos y luego se ejecutan correctamente desde allí.

¿Qué puedo hacer para asegurarme de que la transmisión comienza al principio y se reproduce correctamente en varias versiones de Android?

O, ¿hay una mejor implementación que debería usar?


Algunas versiones de Android parecen interpretar el HLS en BipBopAll como HLS en vivo en lugar de VOD HLS, y por lo tanto, el reproductor multimedia comienza cerca del punto "en vivo". Cerca del final del contenido, alrededor de 29 minutos en el contenido.

Y esta es la razón: antes de 4.3, la última línea en un archivo de lista de reproducción HLS no se analizó a menos que terminara en ''/ n''.

Consulte el historial de cambios en ese archivo: http://androidxref.com/4.3_r2.1/history/frameworks/av/media/libstagefright/httplive/M3UParser.cpp , el 31/12/12, hay un cambio que se ha corregido el problema. El tema se ha ido en 4.4.

Por lo tanto, una forma de resolver el problema en versiones anteriores es agregar una nueva línea después de la última línea de la lista de reproducción en el servidor, o implementar un proxy HTTP en su aplicación que agregue esa nueva línea, lo que puede no ser trivial ...


Luego de una investigación adicional, encontré que la siguiente información puede ayudar a otras personas a que funcione la transmisión HLS en Android.

Codificación : la codificación del video y la configuración de la segmentación pueden tener un gran impacto en las versiones de Android que admite el video. Terminé creando un video usando HandBrake, con la siguiente configuración:

  • Archivo mp4
  • H.264; Perfil de Línea de Base; Nivel 3
  • AAC Audio; 44.1k; 128 bits ( Nota : encontré que JellyBean era mucho más exigente con el audio que ICS / Honeycomb. Algunos bitrates de audio crearían videos que Jellybean no reproduciría en general. En general, el audio Mono y bitrate bajo parecía funcionar mejor en Jellybean).

Segmentación : al usar Apple MediaFileSegmenter, encontré que agregar las banderas "-no-punto-flotante-duración" y "-z ninguno" me permitió crear un video que funcionó en Android 3.0-> 4.2

Pan de jengibre : no pude hacer que Android 2.3 funcionara con HLS fuera de la caja, pero sí encontré que el uso de la biblioteca Vitamio funcionó bastante bien (consulte esta pregunta para obtener más información)


<?xml version="1.0" encoding="utf-8" ?> - <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <VideoView android:id="@+id/surface_view" android:layout_width="fill_parent" android:layout_height="300dp" android:layout_gravity="center" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_below="@+id/surface_view" android:layout_marginRight="62dp" android:layout_marginTop="16dp" android:text="Stop" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/button1" android:layout_alignBottom="@+id/button1" android:layout_alignParentLeft="true" android:layout_marginLeft="34dp" android:text="Start" /> </RelativeLayout> ******************************************************************* startB.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mVideoView = (VideoView) findViewById(R.id.surface_view); mVideoView.setVideoURI(Uri.parse("http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8")); mVideoView.setMediaController(new MediaController(MainActivity.this)); mVideoView.requestFocus(); mVideoView.postInvalidateDelayed(100); new Thread(new Runnable() { public void run() { mVideoView.start(); } }).start(); } });