/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.segment.m3u8; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import com.ttProject.segment.ISegmentManager; public class M3u8Manager implements ISegmentManager { private final String header; private final String allowCache; private final String targetDuration; private final String targetVersion; private Integer num; // このあたりのstaticデータの管理をするやつがm3u8Managerということにしておきたい。 private final String m3u8File; private final Integer limit; // limitの設定は固定3でいいはずだが、動作検証で全データ出力させてみたいときもあるので、注意が必要。 List<M3u8Element> elementData; /** * コンストラクタ * @param m3u8File */ public M3u8Manager(String m3u8File, float duration, Integer limit) { header = "#EXTM3U"; allowCache = "#EXT-X-ALLOW-CACHE:NO"; targetDuration = "#EXT-X-TARGETDURATION:" + (int)duration; targetVersion = "#EXT-X-VERSION:3"; this.m3u8File = m3u8File; this.limit = limit; if(limit != null) { elementData = new ArrayList<M3u8Element>(); num = 0; } else { // ファイルに先頭の情報を書き込む elementData = null; try { PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(m3u8File, false))); pw.println(header); pw.println(allowCache); pw.println(targetDuration); pw.println(targetVersion); pw.close(); pw = null; } catch (Exception e) { } } } /** * データの書き込み処理 * @param target * @param http * @param duration * @param index * @param endFlg */ @Override public void writeData(String target, String http, float duration, int index, boolean endFlg) { M3u8Element element = new M3u8Element(target, http, duration, index); if(limit != null) { // limitが設定されている場合は、m3u8上のデータ量がきまっている。 elementData.add(element); // エレメントを追加する。 if(elementData.size() > limit) { // elementデータよりサイズが大きい場合は必要のないデータがあるので、先頭のデータを落とす M3u8Element removedData = elementData.remove(0); // いらなくなったファイルは削除する必要があるので、消す File deleteFile = new File(removedData.getFile()); if(deleteFile.exists()) { // 削除しておく。 deleteFile.delete(); } } try { PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(m3u8File, false))); pw.println(header); pw.println(allowCache); pw.println(targetDuration); pw.println(targetVersion); pw.print("#EXT-X-MEDIA-SEQUENCE:"); num ++; pw.println(num); // 内容を書き込む for(M3u8Element data : elementData) { if(data.isFirst()) { pw.println("#EXT-X-DISCONTINUITY"); } pw.println(data.getInfo()); pw.println(data.getHttp()); } if(endFlg) { pw.println("#EXT-X-ENDLIST"); } pw.close(); pw = null; } catch (Exception e) { } } else { try { PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(m3u8File, true))); pw.println(element.getInfo()); pw.println(element.getHttp()); if(endFlg) { pw.println("#EXT-X-ENDLIST"); } pw.close(); pw = null; } catch (Exception e) { } } } @Override public void writeEnd() { try { PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(m3u8File, true))); pw.println("#EXT-X-ENDLIST"); pw.close(); pw = null; } catch (Exception e) { } } }