一、初始化FLV封装包FlvPacker
private void init(){
mFlvPacker = new FlvPacker();
mFlvPacker.initVideoParams(WIDTH, HEIGHT, FRAME_RATE);
mFlvPacker.initAudioParams(44100, AudioFormat.ENCODING_PCM_16BIT,false);
mFlvPacker.setPacketListener(new Packer.OnPacketListener() {
@Override
public void onPacket(final byte[] data, final int packetType) {
IOUtils.write(mOutStream, data, 0, data.length);
//Log.e("wangqi","onPacket()");
pushExecutor.execute(new Runnable() {
@Override
public void run() {
if(onMediaInfoListener != null)
{
onMediaInfoListener.onFlvData(data,data.length,packetType);
}
}
});
// LogUtils.getInstance().I(TAG, " data.length "+data.length + " packetType " + packetType+" DATA_DIR "+DATA_DIR);
}
});
}
二、编码器编码出来的H.264数据进行FLV封装
while (outputBufferIndex >= 0) {
ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];
//进行flv封装
mFlvPacker.onVideoData(outputBuffer, info);
mCodec.releaseOutputBuffer(outputBufferIndex, false);
outputBufferIndex = mCodec.dequeueOutputBuffer(info, 0);
}
三、编码器编码出来的AAC数据进行FLV封装
public void startAudio(){
audioEncodecThread = new Thread() {
@Override
public void run() {
isAudioEncoder = true;
pts = 0;
if(audioEncodec!=null){
while(isAudioEncoder)
{
int outputBufferIndex = audioEncodec.dequeueOutputBuffer(audioBufferinfo, 0);
if(outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED)
{
}
else
{
while(outputBufferIndex >= 0)
{
ByteBuffer outputBuffer = audioEncodec.getOutputBuffers()[outputBufferIndex];
outputBuffer.position(audioBufferinfo.offset);
outputBuffer.limit(audioBufferinfo.offset + audioBufferinfo.size);
if(pts == 0)
{
pts = audioBufferinfo.presentationTimeUs;
}
audioBufferinfo.presentationTimeUs = audioBufferinfo.presentationTimeUs - pts;
// byte[] data = new byte[outputBuffer.remaining()];
// outputBuffer.get(data, 0, data.length);
// if(onMediaInfoListener != null)
// {
// onMediaInfoListener.onAudioInfo(data);
// }
mFlvPacker.onAudioData(outputBuffer, audioBufferinfo);
audioEncodec.releaseOutputBuffer(outputBufferIndex, false);
outputBufferIndex = audioEncodec.dequeueOutputBuffer(audioBufferinfo, 0);
}
}
}
}
}
};
audioEncodecThread.start();
}
四、开始FLV封装
mFlvPacker.start();
五、停止FLV封装
mFlvPacker.stop();
总结:FLV封装的代码如下所示