录音app录制1分钟 音频文件仅显示50s


diff --git a/media/libstagefright/AMRWriter.cpp b/media/libstagefright/AMRWriter.cpp
index a1aa5dd..66df431 100644
--- a/media/libstagefright/AMRWriter.cpp
+++ b/media/libstagefright/AMRWriter.cpp
@@ -20,6 +20,7 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 
+#include <string.h>
 #include <media/stagefright/foundation/ADebug.h>
 #include <media/stagefright/AMRWriter.h>
 #include <media/stagefright/MediaBuffer.h>
@@ -126,6 +127,7 @@
     mDone = false;
 
     pthread_create(&mThread, &attr, ThreadWrapper, this);
+    pthread_create(&mThread, &attr, ThreadWrapperSaveFile, this);
     pthread_attr_destroy(&attr);
 
     mStarted = true;
@@ -146,10 +148,10 @@
         return OK;
     }
 
-    mDone = true;
 
     void *dummy;
     status_t status = mSource->stop();
+    mDone = true;
     pthread_join(mThread, &dummy);
 
     status_t err = static_cast<status_t>(reinterpret_cast<uintptr_t>(dummy));
@@ -183,6 +185,9 @@
     return (void *)(uintptr_t) static_cast<AMRWriter *>(me)->threadFunc();
 }
 
+void *AMRWriter::ThreadWrapperSaveFile(void *me) {
+    return (void *)(uintptr_t) static_cast<AMRWriter *>(me)->threadFuncSaveFile();
+}
 status_t AMRWriter::threadFunc() {
     mEstimatedDurationUs = 0;
     mEstimatedSizeBytes = 0;
@@ -190,6 +195,7 @@
     int64_t previousPausedDurationUs = 0;
     int64_t maxTimestampUs = 0;
     status_t err = OK;
+    recoderDataOffset = 0;
 
     prctl(PR_SET_NAME, (unsigned long)"AMRWriter", 0, 0, 0);
     while (!mDone) {
@@ -236,6 +242,9 @@
             notify(MEDIA_RECORDER_EVENT_INFO, MEDIA_RECORDER_INFO_MAX_DURATION_REACHED, 0);
             break;
         }
+        memcpy(recoderData + recoderDataOffset,(const uint8_t *)buffer->data() + buffer->range_offset(),buffer->range_length());
+        recoderDataOffset += buffer->range_length();
+        /*
         ssize_t n = write(mFd,
                         (const uint8_t *)buffer->data() + buffer->range_offset(),
                         buffer->range_length());
@@ -245,7 +254,7 @@
             buffer = NULL;
             err = ERROR_IO;
             break;
-        }
+        }*/
 
         if (err != OK) {
             break;
@@ -262,9 +271,8 @@
     if ((err == OK || err == ERROR_END_OF_STREAM) && stoppedPrematurely) {
         err = ERROR_MALFORMED;
     }
+    mDone = true;
 
-    close(mFd);
-    mFd = -1;
     mReachedEOS = true;
     if (err == ERROR_END_OF_STREAM) {
         return OK;
@@ -272,6 +280,31 @@
     return err;
 }
 
+    status_t AMRWriter::threadFuncSaveFile() {
+        status_t err = OK;
+        while (!mDone) {
+            if((1600 * 20) < recoderDataOffset){
+                int size = recoderDataOffset;
+                ssize_t m = write(mFd,(const uint8_t *)(recoderData), size);
+                memcpy(recoderData,recoderData + size,recoderDataOffset - size);
+                recoderDataOffset = recoderDataOffset - size;
+                if(m < size){
+                    err = ERROR_IO;
+                    break;
+                }
+            }else{
+                sleep (1);
+            }
+        }
+        if(0  < recoderDataOffset){
+            write(mFd, (const uint8_t *)(recoderData), recoderDataOffset);
+        }
+        recoderDataOffset = 0;
+        close(mFd);
+        mFd = -1;
+        return err;
+    }
+
 bool AMRWriter::reachedEOS() {
     return mReachedEOS;
 }
diff --git a/media/libstagefright/include/media/stagefright/AMRWriter.h b/media/libstagefright/include/media/stagefright/AMRWriter.h
index 2ea2f78..72054f9 100644
--- a/media/libstagefright/include/media/stagefright/AMRWriter.h
+++ b/media/libstagefright/include/media/stagefright/AMRWriter.h
@@ -53,13 +53,18 @@
     int64_t mEstimatedDurationUs;
 
     static void *ThreadWrapper(void *);
+    static void *ThreadWrapperSaveFile(void *);
     status_t threadFunc();
+    status_t threadFuncSaveFile();
     bool exceedsFileSizeLimit();
     bool exceedsFileDurationLimit();
     status_t reset();
 
     AMRWriter(const AMRWriter &);
     AMRWriter &operator=(const AMRWriter &);
+    uint8_t *recoderData =(uint8_t *)malloc(sizeof(uint8_t) * 100 * 1024);
+    int recoderDataOffset = 0;
+    pthread_mutex_t mut;
 };
 
 }  // namespace android

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值