From 49be01c8fd58a15b16012dc528673343ff7d73b9 Mon Sep 17 00:00:00 2001
From: Runt <qingingrunt2010@qq.com>
Date: Fri, 04 Apr 2025 06:53:02 +0000
Subject: [PATCH] 优化

---
 app/src/main/java/com/runt/live/media/EncodeHelper.kt |   40 ++++++++++++++-----
 app/src/main/cpp/media_encoder_call.cpp               |   11 +++++
 app/src/main/cpp/media_encoder_call.h                 |    5 ++
 app/src/main/cpp/pusher/live_pusher.cpp               |   23 ++++++-----
 4 files changed, 56 insertions(+), 23 deletions(-)

diff --git a/app/src/main/cpp/media_encoder_call.cpp b/app/src/main/cpp/media_encoder_call.cpp
index 382450e..213e227 100644
--- a/app/src/main/cpp/media_encoder_call.cpp
+++ b/app/src/main/cpp/media_encoder_call.cpp
@@ -28,6 +28,7 @@
     jmd_encode_yuv = env->GetMethodID(clazz,"encodeYUV","([B)V");
     jmd_encode_pcm = env->GetMethodID(clazz,"encodePCM","([B)V");
     jmd_get_sps_pps = env->GetMethodID(clazz,"getSpsPpsData","()[B");
+    jmd_get_audio_seq = env->GetMethodID(clazz,"getAudioSeqData","()[B");
 }
 
 void MediaEncoderCall::encodeYUV(uint8_t* yuvBuffer, int width, int height) {
@@ -62,9 +63,17 @@
 }
 
 void MediaEncoderCall::getSpsPps(uint8_t **data,int *length){
+    getJvmBytes(jmd_get_sps_pps,data,length);
+}
+
+void MediaEncoderCall::getAudioSeqData(uint8_t **data,int *length){
+    getJvmBytes(jmd_get_audio_seq,data,length);
+}
+
+void MediaEncoderCall::getJvmBytes(jmethodID method,uint8_t **data,int *length){
     JNIEnv *env_child;
     javaVM->AttachCurrentThread(&env_child, 0);
-    jbyteArray bytes = reinterpret_cast<jbyteArray> (env_child->CallObjectMethod(instance, jmd_get_sps_pps));
+    jbyteArray bytes = reinterpret_cast<jbyteArray> (env_child->CallObjectMethod(instance, method));
     if (!bytes) {
         LOGE("Java returned null byte array");
         return;
diff --git a/app/src/main/cpp/media_encoder_call.h b/app/src/main/cpp/media_encoder_call.h
index 56a20d7..f73041c 100644
--- a/app/src/main/cpp/media_encoder_call.h
+++ b/app/src/main/cpp/media_encoder_call.h
@@ -17,15 +17,18 @@
     void init(JNIEnv *env_);
     void encodePCM(uint8_t* pcmBuffer, int width, int height);
     void getSpsPps(uint8_t **data,int *length);
+    void getAudioSeqData(uint8_t **data,int *length);
 
 
 private:
     JavaVM *javaVM;
     JNIEnv *env = 0;
     jobject instance;
-    jmethodID jmd_get_sps_pps;
+    jmethodID jmd_get_sps_pps,jmd_get_audio_seq;
     jmethodID jmd_encode_yuv,jmd_encode_pcm;
 
+    void getJvmBytes(jmethodID method,uint8_t **data,int *length);
+
 };
 
 #endif //LIVEPROJECT_MEDIA_ENCODER_CALL_H
diff --git a/app/src/main/cpp/pusher/live_pusher.cpp b/app/src/main/cpp/pusher/live_pusher.cpp
index cd99c93..80e2e9c 100644
--- a/app/src/main/cpp/pusher/live_pusher.cpp
+++ b/app/src/main/cpp/pusher/live_pusher.cpp
@@ -192,15 +192,20 @@
 }
 
 void LivePusher::sendAudioHeader() {
-    uint8_t *packet = new uint8_t[2];
-    packet[0] = 0x12;
-    packet[1] = 0x8;
-    pushAAC(packet,2,RTMP_GetTime() - start_time);
-    free(packet);
+
+    uint8_t *data;int size;
+    mediaEncoderCall->getAudioSeqData(&data,&size);
+    if(size == 0){
+        data = new uint8_t[2];
+        data[0] = 0x12;
+        data[1] = 0x08;
+    }
+    pushAAC(data,2,RTMP_GetTime() - start_time);
+    free(data);
 }
 
 void LivePusher::pushAAC(uint8_t *data, int size, uint32_t time) {
-    //LOGE("sendFrame pushAAC 0x%02X 0x%02X 0x%02X 0x%02X %d",data[0],aacData[1],aacData[2],aacData[3],size);
+    //LOGE("sendFrame pushAAC 0x%02X 0x%02X 0x%02X 0x%02X %d",data[0],data[1],data[2],data[3],size);
 
     if(isLive != 1){
         return;
@@ -224,10 +229,8 @@
     output[offset++] = 0xAF; // SoundFormat: AAC, SoundRate: 44.1kHz, SoundSize: 16-bit, SoundType: Stereo
     output[offset++] = data[0] == 0x12 ? 0x00:0x01; //aac raw data
 
-        //flv VideoTagBody --raw aac data
-        memcpy(output + offset, data, size); // data + AAC_ADTS_HEADER_SIZE -> data,
-        // (adts_len - AAC_ADTS_HEADER_SIZE) -> size
-
+    memcpy(output + offset, data, size); // data + AAC_ADTS_HEADER_SIZE -> data,
+    // (adts_len - AAC_ADTS_HEADER_SIZE) -> size
 
     //previous tag size
     addFooter(output,offset += size,body_len + FLV_TAG_HEAD_LEN);
diff --git a/app/src/main/java/com/runt/live/media/EncodeHelper.kt b/app/src/main/java/com/runt/live/media/EncodeHelper.kt
index 52b500b..bcae8b0 100644
--- a/app/src/main/java/com/runt/live/media/EncodeHelper.kt
+++ b/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

--
Gitblit v1.9.1