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.