/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.chunk.mpegts.analyzer; import java.util.List; import org.apache.log4j.Logger; import com.ttProject.chunk.mpegts.AudioDataList; import com.ttProject.chunk.mpegts.VideoDataList; import com.ttProject.media.IAudioData; import com.ttProject.media.Unit; import com.ttProject.media.mpegts.packet.Pes; import com.ttProject.media.mpegts.packet.Pmt; /** * pesの内容から、必要な情報を抜き出してvideoDataListやaudioDataListに設置していくアナライザー * @author taktod */ public class MpegtsPesAnalyzer implements IPesAnalyzer { /** 動作ロガー */ @SuppressWarnings("unused") private Logger logger = Logger.getLogger(MpegtsPesAnalyzer.class); /** 動作pmt情報 */ private Pmt pmt; /** video情報リスト */ private VideoDataList videoDataList; /** 音声情報リスト */ private AudioDataList audioDataList; /** audioDataの解析オブジェクト */ private IAudioDataAnalyzer audioDataAnalyzer = null; /** * audioDataListを設定します */ @Override public void setAudioDataList(AudioDataList audioDataList) { this.audioDataList = audioDataList; } /** * videoDataListを設定します */ @Override public void setVideoDataList(VideoDataList videoDataList) { this.videoDataList = videoDataList; } /** * pesについて調査しなければいけない。 * 解析できたら、必要に応じてaudioDataListやvideoDataListにみつけたデータをいれなければならない。 */ @Override public void analyze(Unit unit, long timestamp) { if(unit instanceof Pmt) { if(pmt == null) { this.pmt = (Pmt)unit; } return; } if(!(unit instanceof Pes)) { // pesのみに興味あり return; } Pes pes = (Pes)unit; if(pes.getPid() == videoDataList.getPid()) { // TODO 動画の場合でも一旦別のデータにもどしてから再構築した方がpcrが音声にあるときに動作できるようになるので、そうしたい。 // 動画のpesの場合 videoDataList.addPes(pes); } else if(pes.getPid() == audioDataList.getPid()) { if(audioDataAnalyzer == null) { // 音声のpesの場合 switch(pes.getCodec()) { case AUDIO_AAC: // aacの場合 audioDataAnalyzer = new AacAudioDataAnalyzer(); break; case AUDIO_MPEG1: // mp3の場合 audioDataAnalyzer = new Mp3AudioDataAnalyzer(); break; default: throw new RuntimeException("analyzerが決定しませんでした。"); // break; } } List<IAudioData> audioList = audioDataAnalyzer.analyzeAudioData(pes); if(audioList != null) { for(IAudioData audioData : audioList) { audioDataList.addAudioData(audioData, audioDataAnalyzer.getLastPtsValue()); } } } return; } }