我有一个要求,我需要从 Android 中的 HLS 流中提取元数据。我找到了两个库 FFMPEG 和 VITAMIO。考虑到 android 上 HLS 流的支持碎片化,在阅读了大量更令人困惑的文章后,我最终确定了上述两个库以供进一步研究。我还没有找到一个应用程序提取元数据(定时元数据)已经在安卓上完成。
我很困惑,如果它甚至可能在 Android 上。如果是这样,我应该使用哪种方法......帮帮我......
我有一个要求,我需要从 Android 中的 HLS 流中提取元数据。我找到了两个库 FFMPEG 和 VITAMIO。考虑到 android 上 HLS 流的支持碎片化,在阅读了大量更令人困惑的文章后,我最终确定了上述两个库以供进一步研究。我还没有找到一个应用程序提取元数据(定时元数据)已经在安卓上完成。
我很困惑,如果它甚至可能在 Android 上。如果是这样,我应该使用哪种方法......帮帮我......
解析 m3u8 相对容易。您需要创建HashMap
和存储解析的数据String
。Integer
M3U8 文件由 3 个入口标签组成,分别代表 m3u8 的入口、媒体序列和所有媒体文件的片段持续时间,除了最后一个,与其余的不同。
在每个#EXTINF
整数持续时间都粘贴到它之后,所以我们需要通过使用基本正则表达式解析字符串来获得它。
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;
}
干杯。
正如尼古拉的回答所建议的那样,定时文本元数据没有存储在 m3u8 文件中,而是存储在 mpeg2 ts 段中。此处提供了如何嵌入 ts 的概述:https ://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/HTTP_Live_Streaming_Metadata_Spec/HTTP_Live_Streaming_Metadata_Spec.pdf
您可以尝试使用 ffmpeg 提取元数据,命令应该是这样的:
ffmpeg -i in.ts -f ffmetadata metadata.txt
您需要使用 jni 和 libavformat 进行等效操作。这并不容易,您仍然需要想出一种机制,将读取的元数据发送给您的应用程序。
如果可以的话,我建议通过单独的机制发送定时元数据。你能把它解压成一个文本文件,让你的播放器单独下载吗?然后你与视频播放器报告的时间线对齐?那实现起来会简单得多,但我不知道你的要求。