/*
* myLib - https://github.com/taktod/myLib
* Copyright (c) 2014 ttProject. All rights reserved.
*
* Licensed under The MIT license.
*/
package com.ttProject.container.mpegts.test;
import org.apache.log4j.Logger;
import org.junit.Test;
import com.ttProject.container.IContainer;
import com.ttProject.container.IReader;
import com.ttProject.container.mpegts.MpegtsCodecType;
import com.ttProject.container.mpegts.MpegtsPacketReader;
import com.ttProject.container.mpegts.MpegtsPacketWriter;
import com.ttProject.container.mpegts.field.PmtElementaryField;
import com.ttProject.container.mpegts.field.PmtElementaryFieldFactory;
import com.ttProject.container.mpegts.type.Pat;
import com.ttProject.container.mpegts.type.Pes;
import com.ttProject.container.mpegts.type.Pmt;
import com.ttProject.container.mpegts.type.Sdt;
import com.ttProject.nio.channels.FileReadChannel;
import com.ttProject.nio.channels.IFileReadChannel;
/**
* mpegts (multi track test)
* @author taktod
*/
public class MpegtsTestMulti {
/** logger */
private Logger logger = Logger.getLogger(MpegtsTestMulti.class);
@Test
public void test() throws Exception {
logger.info("test start");
analyzerTest(
FileReadChannel.openFileReadChannel(
"http://49.212.39.17/mario_3video_1audio.ts"
)
);
}
private void analyzerTest(IFileReadChannel source) {
MpegtsPacketWriter writer1 = null;
MpegtsPacketWriter writer2 = null;
MpegtsPacketWriter writer3 = null;
MpegtsPacketWriter writer4 = null;
PmtElementaryFieldFactory factory = new PmtElementaryFieldFactory();
PmtElementaryFieldFactory factory_audio = new PmtElementaryFieldFactory();
try {
writer1 = new MpegtsPacketWriter("output_640x360.ts");
writer2 = new MpegtsPacketWriter("output_320x180.ts");
writer3 = new MpegtsPacketWriter("output_160x90.ts");
writer4 = new MpegtsPacketWriter("output_audio_only.ts");
Sdt sdt = new Sdt();
sdt.writeDefaultProvider("test", "hpgehoge");
writer1.addContainer(sdt);
writer2.addContainer(sdt);
writer3.addContainer(sdt);
writer4.addContainer(sdt);
Pat pat = new Pat();
writer1.addContainer(pat);
writer2.addContainer(pat);
writer3.addContainer(pat);
writer4.addContainer(pat);
Pmt pmt = new Pmt(pat.getPmtPid());
PmtElementaryField videoElementaryField = factory.makeNewField(MpegtsCodecType.VIDEO_H264);
pmt.addNewField(videoElementaryField);
pmt.setPcrPid(videoElementaryField.getPid());
PmtElementaryField audioElementaryField = factory.makeNewField(MpegtsCodecType.AUDIO_AAC);
pmt.addNewField(audioElementaryField);
writer1.addContainer(pmt);
writer2.addContainer(pmt);
writer3.addContainer(pmt);
pmt = new Pmt(pat.getPmtPid());
PmtElementaryField audioElementaryField2 = factory_audio.makeNewField(MpegtsCodecType.AUDIO_AAC);
pmt.addNewField(audioElementaryField2);
pmt.setPcrPid(audioElementaryField2.getPid());
writer4.addContainer(pmt);
IReader reader = new MpegtsPacketReader();
IContainer container = null;
while((container = reader.read(source)) != null) {
if(container instanceof Pes) {
Pes pes = (Pes)container;
logger.info(pes);
switch(pes.getPid()) {
case 0x0100: // track1
if(pes.getFrame() != null) {
writer1.addFrame(videoElementaryField.getPid(), pes.getFrame());
}
break;
case 0x0101: // track2
if(pes.getFrame() != null) {
writer2.addFrame(videoElementaryField.getPid(), pes.getFrame());
}
break;
case 0x0102: // track3
if(pes.getFrame() != null) {
writer3.addFrame(videoElementaryField.getPid(), pes.getFrame());
}
break;
case 0x0103: // audioTrack
if(pes.getFrame() != null) {
writer1.addFrame(audioElementaryField.getPid(), pes.getFrame());
writer2.addFrame(audioElementaryField.getPid(), pes.getFrame());
writer3.addFrame(audioElementaryField.getPid(), pes.getFrame());
writer4.addFrame(audioElementaryField2.getPid(), pes.getFrame());
}
break;
default:
break;
}
}
}
}
catch(Exception e) {
logger.warn(e);
}
finally {
if(writer1 != null) {
try {
writer1.prepareTailer();
}
catch(Exception e) {
}
writer1 = null;
}
if(writer2 != null) {
try {
writer2.prepareTailer();
}
catch(Exception e) {
}
writer2 = null;
}
if(writer3 != null) {
try {
writer3.prepareTailer();
}
catch(Exception e) {}
writer3 = null;
}
if(writer4 != null) {
try {
writer4.prepareTailer();
}
catch(Exception e) {}
writer4 = null;
}
if(source != null) {
try {
source.close();
}
catch(Exception e) {}
source = null;
}
}
}
}