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
录音app录制1分钟 音频文件仅显示50s
最新推荐文章于 2024-10-09 17:45:19 发布