package org.jcodec.samples.h264embed;
import static org.jcodec.common.io.NIOUtils.readableChannel;
import static org.jcodec.common.io.NIOUtils.writableChannel;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import org.jcodec.codecs.h264.H264Utils;
import org.jcodec.common.DemuxerTrack;
import org.jcodec.common.DemuxerTrackMeta;
import org.jcodec.common.MuxerTrack;
import org.jcodec.common.VideoCodecMeta;
import org.jcodec.common.io.SeekableByteChannel;
import org.jcodec.common.model.Packet;
import org.jcodec.containers.mp4.Brand;
import org.jcodec.containers.mp4.MP4Packet;
import org.jcodec.containers.mp4.demuxer.MP4Demuxer;
import org.jcodec.containers.mp4.muxer.MP4Muxer;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* JCodec sample code
*
* This sample embeds text onto H.264 picture without full re-transcode cycle
*
* @author The JCodec project
*
*/
public class H264EmbedMain {
public static void main(String[] args) throws IOException {
if (args.length < 2) {
System.out.println("H264 Text Embed");
System.out.println("Syntax: <in> <out>");
return;
}
SeekableByteChannel sink = null;
SeekableByteChannel source = null;
try {
source = readableChannel(new File(args[0]));
sink = writableChannel(new File(args[1]));
MP4Demuxer demux = new MP4Demuxer(source);
MP4Muxer muxer = MP4Muxer.createMP4Muxer(sink, Brand.MOV);
EmbedTranscoder transcoder = new EmbedTranscoder();
DemuxerTrack inTrack = demux.getVideoTrack();
DemuxerTrackMeta meta = inTrack.getMeta();
VideoCodecMeta videoCodecMeta = meta.getVideoCodecMeta();
MuxerTrack outTrack = muxer.addVideoTrack(meta.getCodec(), videoCodecMeta);
ByteBuffer _out = ByteBuffer
.allocate(videoCodecMeta.getSize().getWidth() * videoCodecMeta.getSize().getHeight() * 6);
Packet inFrame;
int totalFrames = (int) meta.getTotalFrames();
for (int i = 0; (inFrame = inTrack.nextFrame()) != null; i++) {
ByteBuffer data = inFrame.getData();
_out.clear();
ByteBuffer result = transcoder.transcode(H264Utils.splitFrame(data), _out);
outTrack.addFrame(MP4Packet.createMP4PacketWithData((MP4Packet) inFrame, result));
if (i % 100 == 0)
System.out.println((i * 100 / totalFrames) + "%");
}
muxer.finish();
} finally {
if (sink != null)
sink.close();
if (source != null)
source.close();
}
}
}