android ffmpeg http-live-streaming m3u8 vitamio

android - Extraer metadatos de la secuencia HLS(archivo m3u8)



ffmpeg http-live-streaming (2)

Tengo un requisito en el que necesito extraer metadatos de un HLS Stream en Android. He encontrado dos bibliotecas FFMPEG y VITAMIO. Teniendo en cuenta la compatibilidad fragmentada de la transmisión de HLS en Android, y después de leer una gran cantidad de artículos aún más confusos, he finalizado las dos bibliotecas anteriores para seguir investigando. No he encontrado una sola aplicación donde la extracción de metadatos (metadatos cronometrados) haya sido hecho en Android.

Estoy confundido si es posible en Android. Y si es así, ¿qué enfoque debería usar ... ayúdenme chicos ...


Los metadatos de texto cronometrados no se almacenan en el archivo m3u8 como lo sugiere la respuesta de Nikola, sino que se almacenan en los segmentos ts mpeg2. Aquí encontrará una descripción general de cómo está incrustado en el ts: https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/HTTP_Live_Streaming_Metadata_Spec/HTTP_Live_Streaming_Metadata_Spec.pdf

Puedes intentar extraer los metadatos con ffmpeg, el comando debería ser algo similar a esto:

ffmpeg -i in.ts -f ffmetadata metadata.txt

Deberás hacer el equivalente usando jni y libavformat. No es increíblemente fácil, y aún necesitará crear un mecanismo para señalar los metadatos de lectura a su aplicación.

Si puede, le recomendaría que indique los metadatos cronometrados a través de un mecanismo por separado. ¿Podrías extraerlo y ponerlo como un archivo de texto que tu reproductor descargue por separado? Entonces te alineas con la línea de tiempo según lo informado por el reproductor de video? Eso sería mucho más fácil de implementar, pero no conozco sus requisitos.


El análisis de m3u8 es relativamente fácil. Necesita crear HashMap de String e Integer para almacenar datos analizados. El archivo M3U8 está compuesto por 3 etiquetas de entrada que representan la entrada de m3u8, la secuencia de medios y la duración del segmento de todos los archivos multimedia, excepto el último, que difiere del resto.

Después de cada duración de #EXTINF entero se adhiere a él, así que tenemos que obtener esto mediante el análisis de la cadena con expresiones regulares básicas.

private HashMap<String, Integer> parseHLSMetadata(InputStream i ){ try { BufferedReader r = new BufferedReader(new InputStreamReader(i, "UTF-8")); String line; HashMap<String, Integer> segmentsMap = null; String digitRegex = "//d+"; Pattern p = Pattern.compile(digitRegex); while((line = r.readLine())!=null){ if(line.equals("#EXTM3U")){ //start of m3u8 segmentsMap = new HashMap<String, Integer>(); }else if(line.contains("#EXTINF")){ //once found EXTINFO use runner to get the next line which contains the media file, parse duration of the segment Matcher matcher = p.matcher(line); matcher.find(); //find the first matching digit, which represents the duration of the segment, dont call .find() again that will throw digit which may be contained in the description. segmentsMap.put(r.readLine(), Integer.parseInt(matcher.group(0))); } } r.close(); return segmentsMap; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }

Aclamaciones.