/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.packet.flv; import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.WritableByteChannel; import com.ttProject.media.flv.CodecType; /** * flvHeaderPacketは先頭にHashデータを保持させておく。(4バイト) * http経由でアクセスする場合は、どのファイルにアクセスすればいいかわからないので、インデックス番号を応答するものも準備しておく。(そのインデックス番号以降のデータをうけとるみたいな感じ) * @author taktod */ public class FlvHeaderPacket extends FlvPacket { private ByteBuffer buffer; private ByteBuffer flvHeader = null; private ByteBuffer videoSequenceHeader = null; private ByteBuffer audioSequenceHeader = null; private CodecType videoCodec = CodecType.NONE; private CodecType audioCodec = CodecType.NONE; private boolean isSaved = false; public FlvHeaderPacket(FlvPacketManager manager) { super(manager); } @Override public boolean isHeader() { return true; } public boolean isSaved() { return isSaved; } public CodecType getVideoCodec() { return videoCodec; } public void setVideoCodec(CodecType codec) { videoCodec = codec; } public CodecType getAudioCodec() { return audioCodec; } public void setAudioCodec(CodecType codec) { audioCodec = codec; } /** * 解析を実施します。 * ここにくるデータは、mediaPacket側でみつけた、単一パケットのコピーとしますので、終端等は調べる必要なし。 */ @Override public boolean analize(ByteBuffer buffer) { byte type = buffer.get(); buffer.rewind(); switch(type) { case FlvPacketManager.AUDIO_TAG: audioSequenceHeader = buffer; isSaved = false; break; case FlvPacketManager.VIDEO_TAG: videoSequenceHeader = buffer; isSaved = false; break; case FlvPacketManager.FLV_TAG: flvHeader = buffer; videoSequenceHeader = null; audioSequenceHeader = null; break; default: return false; } ByteBuffer data = ByteBuffer.allocate( flvHeader.limit() + (videoSequenceHeader == null ? 0 : videoSequenceHeader.limit()) + (audioSequenceHeader == null ? 0 : audioSequenceHeader.limit()) ); data.put(flvHeader); flvHeader.rewind(); if(videoSequenceHeader != null) { data.put(videoSequenceHeader); videoSequenceHeader.rewind(); } if(audioSequenceHeader != null) { data.put(audioSequenceHeader); audioSequenceHeader.rewind(); } this.buffer = data; return true; } @Override public void writeData(String targetFile, boolean append) { try { WritableByteChannel channel = Channels.newChannel(new FileOutputStream(targetFile, append)); // 先頭にcrc値をいれておく必要あり。 ByteBuffer header = ByteBuffer.allocate(4); header.putInt(getManager().getCRC()); header.flip(); channel.write(header); // データ実体を書き込む buffer.flip(); channel.write(buffer); } catch (Exception e) { e.printStackTrace(); } finally { isSaved = true; } } }