/*
* myLib - https://github.com/taktod/myLib
* Copyright (c) 2014 ttProject. All rights reserved.
*
* Licensed under The MIT license.
*/
package com.ttProject.container.test;
import org.apache.log4j.Logger;
import org.junit.Test;
import com.ttProject.container.IContainer;
import com.ttProject.container.IReader;
import com.ttProject.container.IWriter;
import com.ttProject.container.adts.AdtsUnitWriter;
import com.ttProject.container.flv.FlvTagReader;
import com.ttProject.container.flv.FlvTagWriter;
import com.ttProject.container.flv.type.AudioTag;
import com.ttProject.container.flv.type.VideoTag;
import com.ttProject.container.mp3.Mp3UnitWriter;
import com.ttProject.container.mpegts.MpegtsCodecType;
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.Pmt;
import com.ttProject.container.mpegts.type.Sdt;
import com.ttProject.container.ogg.OggPageWriter;
import com.ttProject.frame.CodecType;
import com.ttProject.nio.channels.FileReadChannel;
import com.ttProject.nio.channels.IFileReadChannel;
/**
* convert container from flv to ?
* @author taktod
*/
public class FlvToTest {
/** logger */
private Logger logger = Logger.getLogger(FlvToTest.class);
/**
* to mp3.
* @throws Exception
*/
// @Test
public void mp3() throws Exception {
logger.info("from flv to mp3 test.");
convertTest(
FileReadChannel.openFileReadChannel(
Thread.currentThread().getContextClassLoader().getResource("mp3.flv")
),
new Mp3UnitWriter("output.mp3"),
0, 1
);
}
/**
* to adts.
* @throws Exception
*/
@Test
public void adts() throws Exception {
logger.info("from flv to adts test");
convertTest(
FileReadChannel.openFileReadChannel(
Thread.currentThread().getContextClassLoader().getResource("aac.flv")
),
new AdtsUnitWriter("output.aac"),
0, 1
);
}
/**
* to ogg
* @throws Exception
*/
@Test
public void ogg() throws Exception {
OggPageWriter writer = new OggPageWriter("output.ogg");
logger.info("from flv to ogg test");
writer.prepareHeader(CodecType.SPEEX);
convertTest(
FileReadChannel.openFileReadChannel(
Thread.currentThread().getContextClassLoader().getResource("speex.flv")
// "http://streams.videolan.org/issues/2973/audio-only-speex.flv"
// "http://streams.videolan.org/issues/2973/test_speex.flv"
),
writer,
0, 1
);
}
/**
* to mpegts(mp3)
* @throws Exception
*/
@Test
public void mpegts_mp3() throws Exception {
logger.info("from flv to mpegts test(mp3)");
MpegtsPacketWriter writer = new MpegtsPacketWriter("output_mp3.ts");
/*
* in order to move these task into prepareHeader
* we need to detect the trackId(pid) for each codec works.
*/
PmtElementaryFieldFactory pmtFieldFactory = new PmtElementaryFieldFactory();
// need sdt pat pmt.
Sdt sdt = new Sdt();
sdt.writeDefaultProvider("test", "hogehoge");
writer.addContainer(sdt);
Pat pat = new Pat();
writer.addContainer(pat);
Pmt pmt = new Pmt(pat.getPmtPid());
PmtElementaryField elementaryField = pmtFieldFactory.makeNewField(CodecType.MP3);
pmt.addNewField(elementaryField);
pmt.setPcrPid(elementaryField.getPid());
writer.addContainer(pmt);
convertTest(
FileReadChannel.openFileReadChannel(
Thread.currentThread().getContextClassLoader().getResource("mp3.flv")
),
writer,
0,
elementaryField.getPid()
);
}
/**
* to mpegts(aac)
* @throws Exception
*/
@Test
public void mpegts_aac() throws Exception {
logger.info("from flv to mpegts test(aac)");
MpegtsPacketWriter writer = new MpegtsPacketWriter("output_aac.ts");
PmtElementaryFieldFactory pmtFieldFactory = new PmtElementaryFieldFactory();
// firstly need sdt pat pmt.
Sdt sdt = new Sdt();
sdt.writeDefaultProvider("test", "hogehoge");
writer.addContainer(sdt);
Pat pat = new Pat();
writer.addContainer(pat);
Pmt pmt = new Pmt(pat.getPmtPid());
PmtElementaryField elementaryField = pmtFieldFactory.makeNewField(MpegtsCodecType.AUDIO_AAC);
pmt.setPcrPid(elementaryField.getPid());
pmt.addNewField(elementaryField);
writer.addContainer(pmt);
convertTest(
FileReadChannel.openFileReadChannel(
Thread.currentThread().getContextClassLoader().getResource("aac.flv")
),
writer,
0,
elementaryField.getPid()
);
}
/**
* to mpegts(h264)
* @throws Exception
*/
@Test
public void mpegts_h264() throws Exception {
logger.info("from flv to mpegts test(h264)");
MpegtsPacketWriter writer = new MpegtsPacketWriter("output_h264.ts");
PmtElementaryFieldFactory pmtFieldFactory = new PmtElementaryFieldFactory();
// firstly need sdt pat pmt
Sdt sdt = new Sdt();
sdt.writeDefaultProvider("test", "hogehoge");
writer.addContainer(sdt);
Pat pat = new Pat();
writer.addContainer(pat);
Pmt pmt = new Pmt(pat.getPmtPid());
PmtElementaryField elementaryField = pmtFieldFactory.makeNewField(MpegtsCodecType.VIDEO_H264);
pmt.setPcrPid(elementaryField.getPid());
pmt.addNewField(elementaryField);
writer.addContainer(pmt);
convertTest(
FileReadChannel.openFileReadChannel(
Thread.currentThread().getContextClassLoader().getResource("h264.flv")
),
writer,
elementaryField.getPid(),
0
);
}
/**
* to mpegts(h264 / aac)
* @throws Exception
*/
@Test
public void mpegts_h264_aac() throws Exception {
logger.info("from flv to mpegts test(h264 / aac)");
MpegtsPacketWriter writer = new MpegtsPacketWriter("output_h264_aac.ts");
PmtElementaryFieldFactory pmtFieldFactory = new PmtElementaryFieldFactory();
// firstly need sdt pat pmt
Sdt sdt = new Sdt();
sdt.writeDefaultProvider("test", "hogehoge");
writer.addContainer(sdt);
Pat pat = new Pat();
writer.addContainer(pat);
Pmt pmt = new Pmt(pat.getPmtPid());
PmtElementaryField videoElementaryField = pmtFieldFactory.makeNewField(MpegtsCodecType.VIDEO_H264);
pmt.setPcrPid(videoElementaryField.getPid());
pmt.addNewField(videoElementaryField);
PmtElementaryField audioElementaryField = pmtFieldFactory.makeNewField(MpegtsCodecType.AUDIO_AAC);
pmt.addNewField(audioElementaryField);
writer.addContainer(pmt);
convertTest(
FileReadChannel.openFileReadChannel(
Thread.currentThread().getContextClassLoader().getResource("h264_aac.flv")
),
writer,
videoElementaryField.getPid(),
audioElementaryField.getPid()
);
}
/**
* to mpegts(h264 / aac) (this h264 slice frame is constisted with 2 slice nals)
* from iphone 5S
* @throws Exception
*/
@Test
public void mpegts_h264_aac_ex() throws Exception {
logger.info("from flv to mpegts test(h264 / aac)");
MpegtsPacketWriter writer = new MpegtsPacketWriter("output_h264_aac_ex.ts");
PmtElementaryFieldFactory pmtFieldFactory = new PmtElementaryFieldFactory();
// firstly need sdt pat pmt
Sdt sdt = new Sdt();
sdt.writeDefaultProvider("test", "hogehoge");
writer.addContainer(sdt);
Pat pat = new Pat();
writer.addContainer(pat);
Pmt pmt = new Pmt(pat.getPmtPid());
PmtElementaryField videoElementaryField = pmtFieldFactory.makeNewField(MpegtsCodecType.VIDEO_H264);
pmt.setPcrPid(videoElementaryField.getPid());
pmt.addNewField(videoElementaryField);
PmtElementaryField audioElementaryField = pmtFieldFactory.makeNewField(MpegtsCodecType.AUDIO_AAC);
pmt.addNewField(audioElementaryField);
writer.addContainer(pmt);
convertTest(
FileReadChannel.openFileReadChannel(
"http://49.212.39.17/ahiru.flv"
),
writer,
videoElementaryField.getPid(),
audioElementaryField.getPid()
);
}
/**
* to flv(mp3)
* @throws Exception
*/
@Test
public void flv_mp3() throws Exception {
logger.info("from flv to flv test(mp3)");
FlvTagWriter writer = new FlvTagWriter("output_mp3.flv");
writer.prepareHeader(CodecType.MP3);
convertTest(
FileReadChannel.openFileReadChannel(
Thread.currentThread().getContextClassLoader().getResource("mp3.flv")
),
writer,
0,
1
);
}
/**
* to flv(aac)
* @throws Exception
*/
@Test
public void flv_aac() throws Exception {
logger.info("from flv to flv test(aac)");
FlvTagWriter writer = new FlvTagWriter("output_aac.flv");
writer.prepareHeader(CodecType.AAC);
convertTest(
FileReadChannel.openFileReadChannel(
Thread.currentThread().getContextClassLoader().getResource("aac.flv")
),
writer,
0,
1
);
}
/**
* to flv(flv1)
* @throws Exception
*/
@Test
public void flv_flv1() throws Exception {
logger.info("from flv to flv test(flv1)");
FlvTagWriter writer = new FlvTagWriter("output_flv1.flv");
writer.prepareHeader(CodecType.FLV1);
convertTest(
FileReadChannel.openFileReadChannel(
Thread.currentThread().getContextClassLoader().getResource("flv1.flv")
),
writer,
0,
1
);
}
/**
* to flv(h264)
* @throws Exception
*/
@Test
public void flv_h264() throws Exception {
logger.info("from flv to flv test(h264)");
FlvTagWriter writer = new FlvTagWriter("output_h264.flv");
writer.prepareHeader(CodecType.H264);
convertTest(
FileReadChannel.openFileReadChannel(
Thread.currentThread().getContextClassLoader().getResource("h264.flv")
),
writer,
0,
1
);
}
/**
* convert process body.
* @param source
* @param writer
*/
private void convertTest(IFileReadChannel source, IWriter writer, int videoId, int audioId) {
try {
// write header
// writer.prepareHeader(); // TODO invalid. writer need to be prepared on the original function.
IReader reader = new FlvTagReader();
IContainer container = null;
while((container = reader.read(source)) != null) {
if(container instanceof VideoTag) {
VideoTag vTag = (VideoTag)container;
writer.addFrame(videoId, vTag.getFrame());
}
else if(container instanceof AudioTag) {
AudioTag aTag = (AudioTag)container;
writer.addFrame(audioId, aTag.getFrame());
}
}
// write tailer
writer.prepareTailer(); // tailer is ok
}
catch(Exception e) {
logger.error(e);
}
finally {
if(source != null) {
try {
source.close();
}
catch(Exception e) {
}
source = null;
}
}
}
}