/*
* myLib - https://github.com/taktod/myLib
* Copyright (c) 2014 ttProject. All rights reserved.
*
* Licensed under The MIT license.
*/
package com.ttProject.media.h264.test;
import java.util.List;
import org.apache.log4j.Logger;
import org.junit.Assert;
import com.ttProject.media.flv.CodecType;
import com.ttProject.media.flv.FlvHeader;
import com.ttProject.media.flv.ITagAnalyzer;
import com.ttProject.media.flv.Tag;
import com.ttProject.media.flv.TagAnalyzer;
import com.ttProject.media.flv.tag.VideoTag;
import com.ttProject.media.h264.ConfigData;
import com.ttProject.media.h264.DataNalAnalyzer;
import com.ttProject.media.h264.Frame;
import com.ttProject.media.h264.frame.SequenceParameterSet;
import com.ttProject.nio.channels.ByteReadChannel;
import com.ttProject.nio.channels.FileReadChannel;
import com.ttProject.nio.channels.IFileReadChannel;
import com.ttProject.nio.channels.IReadChannel;
public class FileAnalyzeTest {
private Logger logger = Logger.getLogger(FileAnalyzeTest.class);
// @Test
public void test() throws Exception {
// h264データの読み込みテストを実施します。
// ただしh264を読み込む適当なフォーマットがないので、flvからデータを読み込むことにします。
IFileReadChannel source = FileReadChannel.openFileReadChannel(
Thread.currentThread().getContextClassLoader().getResource("test.flv")
);
FlvHeader flvHeader = new FlvHeader();
flvHeader.analyze(source);
logger.info(flvHeader);
ITagAnalyzer analyzer = new TagAnalyzer();
// sourceを解析していく
Tag tag = null;
DataNalAnalyzer dataNalAnalyzer = new DataNalAnalyzer();
try {
while((tag = analyzer.analyze(source)) != null) {
if(tag instanceof VideoTag) {
VideoTag vTag = (VideoTag) tag;
if(vTag.getCodec() == CodecType.AVC) {
if(vTag.isEndOfSequence()) {
// シーケンス終了時の場合
break;
}
// h.264だったら読み込んでやっておく。
if(vTag.isMediaSequenceHeader()) {
// mshの場合はデータがmshになっているはずなので、解析する必要がある。
// この内容をConfigDataに流してspsとppsを取得する必要あり。
ConfigData configData = new ConfigData();
IReadChannel configChannel = new ByteReadChannel(vTag.getRawData());
configChannel.position(3);
List<Frame> frames = configData.getNals(configChannel);
for(Frame frame : frames) {
// spsとppsがとれているはず。
if(frame instanceof SequenceParameterSet) {
dataNalAnalyzer.setLastSps((SequenceParameterSet)frame);
}
logger.info(frame);
}
}
else {
// 内容を解析して、mpegtsとして使えるSliceIDRとsliceがとれていることを願う
IReadChannel dataChannel = new ByteReadChannel(vTag.getRawData());
dataChannel.position(3);
Frame frame = dataNalAnalyzer.analyze(dataChannel);
// logger.info(HexUtil.toHex(frame.getData(), 0, 5, true));
logger.info(frame);
}
}
}
}
}
catch (Exception e) {
e.printStackTrace();
Assert.fail("例外が発生しました。");
}
source.close();
}
}