마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

pcm 파일 녹음 질문 있습니다.

0 추천

    int mAudioSource = MediaRecorder.AudioSource.MIC;
    int mSampleRate = 44100;
    int mChannelCount = AudioFormat.CHANNEL_IN_STEREO;
    int mAudioFomat = AudioFormat.ENCODING_PCM_16BIT;
    int mBufferSize = AudioTrack.getMinBufferSize(mSampleRate, mChannelCount, mAudioFomat);

       String mFilepath;

    AudioRecord mAudioRecord = null;

    public boolean isRecording = false;

    Thread mRecordThead = new Thread(new Runnable() {
        @Override
        public void run() {
            byte[] readDate = new byte[mBufferSize];
            mFilepath = Environment.getExternalStorageDirectory().getAbsolutePath() +"/record.mp3";

            FileOutputStream fos = null;

            try
            {
                fos = new FileOutputStream(mFilepath);
            }catch(FileNotFoundException e){e.printStackTrace();}

            while (isRecording)
            {
                int ret = mAudioRecord.read(readDate, 0, mBufferSize);
                //Log.d(TAG,)
                try
                {
                    fos.write(readDate, 0, mBufferSize);
                }catch(Exception e){e.printStackTrace();}
            }

            mAudioRecord.stop();
            mAudioRecord.release();
            mAudioRecord = null;

            try
            {
                fos.close();
            }catch (IOException e){e.printStackTrace();}

        }
    });

    public void StartRecording()
    {
        if(isRecording)
            return;;

        mAudioRecord = new AudioRecord(mAudioSource, mSampleRate, mChannelCount, mAudioFomat, mBufferSize);
        mAudioRecord.startRecording();
        isRecording = true;
        mRecordThead.start();
    }


    public void StopRecord()
    {
        if(isRecording)
        {
            isRecording = false;
        }
    }

 

이 코드로 통화음을 pcm 파일로 저장할려고 하는 데 야 1분 정도 녹음 하니 용량이 약 18GB 가 나옵니다.

변환 같은 거 하기 이전에 현재 모바일 개발인지라 도저히 저대로는 쓸 수가 없습니다.

파일 크기를 줄일 방법은 없습니까?

파일 크기를 줄인 다음에 mp3 파일로 변환 하고 싶은 데 좋은 방법이 있습니까?

익명사용자 님이 2019년 4월 11일 질문

2개의 답변

+1 추천

1. 3~4 분짜리 mp3 파일이 3~4메가 정도이고, PCM은 이보다 10배 정도 큰 사이즈인게 보통인데,

18G가 나왔다는건.    코드 자체를  잘 못 짜신 듯 하네요..

아무래도  mAudioRecord.read 가 실패 해도        fos.write(readDate, 0, mBufferSize); 를 계속 불러 사이즈가 엄청 크게 나온 것으로 생각됩니다.

 int ret = mAudioRecord.read(readDate, 0, mBufferSize); 의 반환값이 0 이상일 때만 ret  사이즈만큼 적게 바꾸시면 1분에 10M 정도의 PCM이 저장될 것으로 보입니다.

 

2.  지금 코드는  확장자만 mp3로 저장 될 뿐, 

실제데이터는   PCM 형식이다 보니  플레이어에서 재생 자체를 못 할 겁니다.

MediaRecorder를 사용하시던지 

  MediaCodec 으로 PCAM 데이터를 인코딩해서 mp3로  압축한 후   MediaMuxer로 mp3 파일을 생성하셔야 합니다.

이 부분은  https://thdev.net/576  혹은  https://codetravel.tistory.com/11를 참조하세요..

 

3. 채널 카운트를 모노로 하고, 샘플링레이트를 8000 정도로 낮추면, 음질이 약간 더 떨어지겠지만  이론상 1/10정도 더 줄일 수도 있을 듯 합니다.

익명사용자 님이 2019년 4월 12일 답변
2019년 4월 12일 수정
ret 가 0 이면 mAudioRecord.read 가 실패했다고 예기 할 수 있나요?
0 추천
PCM으로 미리 저장해야하는 이유가 있나요? 없다면 그냥 MediaRecorder로 바로 압축된 형태로 저장하는게 좋을것 같은데요.
회색 (21,340 포인트) 님이 2019년 4월 12일 답변
...