Runt
2025-04-04 49be01c8fd58a15b16012dc528673343ff7d73b9
app/src/main/java/com/runt/live/media/EncodeHelper.kt
@@ -22,6 +22,7 @@
    var mediaCodec264 : MediaCodec;
    var mediaCodecAAC : MediaCodec;
    var spsPpsBytes:ByteArray? = null;
    var audioSeqBytes:ByteArray? = null;
    var startTime = 0L;
    constructor(){
@@ -143,10 +144,6 @@
                    //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}")
@@ -182,16 +179,30 @@
            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)
            }
        }
@@ -209,6 +220,13 @@
        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