| | |
| | | var mediaCodec264 : MediaCodec; |
| | | var mediaCodecAAC : MediaCodec; |
| | | var spsPpsBytes:ByteArray? = null; |
| | | var audioSeqBytes:ByteArray? = null; |
| | | var startTime = 0L; |
| | | |
| | | constructor(){ |
| | |
| | | //Log.i(TAG , "encode: pusher bufferInfo.flags:${bufferInfo.flags}") |
| | | // 通过 JNI 将 H.264 数据发送到 C++ |
| | | if ((bufferInfo.flags and MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) { |
| | | /*parseSpsPps(outputBuffer , bufferInfo.size) |
| | | // 发送 SPS 和 PPS 到 Native |
| | | native_sent_sps_pps(sps!! , pps!!)*/ |
| | | |
| | | spsPpsBytes = ByteArray(bufferInfo.size) |
| | | outputBuffer.get(spsPpsBytes) |
| | | //Log.i(TAG , "encode: pusher BUFFER_FLAG_CODEC_CONFIG:${bufferInfo.size}") |
| | |
| | | |
| | | val bufferInfo = MediaCodec.BufferInfo() |
| | | var outputBufferIndex = mediaCodecAAC.dequeueOutputBuffer(bufferInfo , 10000) |
| | | /*if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { |
| | | val mediaFormat : MediaFormat = mediaCodecAAC.getOutputFormat() |
| | | var seqBuffer = mediaFormat.getByteBuffer("csd-0") |
| | | val seqBytes = ByteArray(seqBuffer!!.remaining()) |
| | | seqBuffer.get(seqBytes, 0, seqBytes.size) |
| | | seqBuffer.clear() |
| | | Log.i(TAG , "initEncoderFLV: spspps: ${spsBytes.size} ${ppsBytes.size}") |
| | | }*/ |
| | | //Log.i(TAG , "encodePCM: pusher outputBufferIndex:${outputBufferIndex} ${bufferInfo.flags}") |
| | | if (outputBufferIndex >= 0) { |
| | | val outputBuffer : ByteBuffer = mediaCodecAAC.getOutputBuffer(outputBufferIndex) !! |
| | | /*val aacData = ByteArray(bufferInfo.size + 7) // ADTS 头 + AAC 数据 |
| | | addADTSToPacket(aacData , bufferInfo.size + 7) |
| | | outputBuffer[aacData , 7 , bufferInfo.size] // 复制 AAC 数据*/ |
| | | val aacData = ByteArray(bufferInfo.size ) |
| | | outputBuffer[aacData] |
| | | if(bufferInfo.flags != 0){ |
| | | audioSeqBytes = ByteArray(bufferInfo.size ) |
| | | outputBuffer[audioSeqBytes] |
| | | }else{ |
| | | /*val aacData = ByteArray(bufferInfo.size + 7) // ADTS 头 + AAC 数据 |
| | | addADTSToPacket(aacData , bufferInfo.size + 7) |
| | | outputBuffer[aacData , 7 , bufferInfo.size] // 复制 AAC 数据*/ |
| | | val aacData = ByteArray(bufferInfo.size ) |
| | | outputBuffer[aacData] |
| | | // 这里可以通过 JNI 传给 C++ |
| | | native_send_aac(aacData,time - startTime) |
| | | } |
| | | outputBuffer.clear() |
| | | // 这里可以通过 JNI 传给 C++ |
| | | native_send_aac(aacData,time - startTime) |
| | | mediaCodecAAC.releaseOutputBuffer(outputBufferIndex , false) |
| | | } |
| | | } |
| | |
| | | return spsPpsBytes!!; |
| | | } |
| | | |
| | | fun getAudioSeqData():ByteArray{ |
| | | audioSeqBytes?.let { |
| | | return it; |
| | | }; |
| | | return ByteArray(0); |
| | | } |
| | | |
| | | private fun addADTSToPacket(packet : ByteArray , packetLen : Int) { |
| | | val profile = 2 // AAC LC |
| | | val freqIdx = 4 // 44100Hz |