2013-10-16 93 views
2

我有一個需求,我需要從Android中的HLS流提取元數據。我找到了兩個庫FFMPEG和VITAMIO。考慮到在Android上支持HLS流式傳輸,並且在閱讀了大量更令人困惑的文章之後,我已經完成了上述兩個庫的進一步研究。我還沒有發現一個應用程序,其中提取了元數據(定時元數據)在Android上完成。從HLS流提取元數據(m3u8文件)

我很困惑,如果它甚至可能在Android上。如果是這樣,我應該使用哪種方法... 幫我出去傢伙....

回答

2

按照Nikola的回答建議,定時文本元數據不存儲在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來做同樣的事情。這並不容易,而且您仍然需要提出一種機制,將讀取的元數據發送給您的應用程序。

如果可以,我建議通過單獨的機制發信號通知定時元數據。你能解開它並把它作爲你的播放器單獨下載的文本文件嗎?那麼你按照視頻播放器報告的時間表排隊?這實現起來會簡單得多,但我不知道你的要求。

+0

感謝您的回覆...你知道我的要求是否可以使用libvlc for android – anz

+1

libvlc_media_new_location ()+ libvlc_media_parse()+ libvlc_media_get_meta()看起來可能有效。我從來沒有嘗試過。 – vipw

+0

你能否向我提供關於如何從ts段中檢索元數據的指針? – anz

7

解析m3u8是相對容易的。您需要創建HashMapStringInteger來存儲分析的數據。 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; 
    } 

乾杯。

+0

感謝您的回覆......我需要閱讀元數據......例如,我需要知道用戶何時播放,暫停,在視頻中尋找特定時間等。將這些數據存儲(更新在m3u8文件中)。 ALSO android默認視頻播放器不允許在hls流中尋找。我應該使用ffmpeg構建我自己的視頻棧還是去維塔米奧? – anz

+0

更新m3u8與閱讀元數據完全不同。 –

+0

該功能給我只有甚至索引.ts文件你能告訴我如何從m3u8鏈接獲得所有.ts文件android –