2017-11-29 5 views
1

Ich versuche, eine Android-Anwendung zu erstellen, die eine Anzahl von X Sekunden und speichert die Datei in .wav FormatAudioRecord nicht genug Speicher für Audiotrack

Das Problem zeichnet ist, dass wenn ich Eingabe mehr als 47 Sekunden (48 und höher) bekomme ich folgende Fehler:

11-29 10:58:42.561 399-1558/? E/AudioFlinger_Tracks: not enough memory for AudioTrack size=8388712 
11-29 10:58:42.561 399-1558/? D/MemoryDealer: AudioTrack (0xb89782f8, size=4198400) 
                0: 0xb8973200 | 0x00000000 | 0x00401000 | F 
               size allocated: 0 (0 KB) 
11-29 10:58:42.561 399-1558/? E/AudioFlinger_Threads: createRecordTrack_l() initCheck failed -12; no control block? 
11-29 10:58:42.561 29103-29103/com.audiorecorder.siemens.audiorecorder E/AudioRecord: AudioFlinger could not create record track, status: -12 
11-29 10:58:42.566 29103-29103/com.audiorecorder.siemens.audiorecorder E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed with status -12. 
11-29 10:58:42.566 29103-29103/com.audiorecorder.siemens.audiorecorder E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object. 

Mein Code arbeitet mit einer beliebigen Anzahl von Sekunden gut, die niedriger als 48 Sekunden ist:

11-29 10:58:39.315 399-1548/? V/audio_hw_primary: disable_audio_route: exit 
11-29 10:58:39.315 399-1548/? D/audio_hw_primary: disable_snd_device: enter 2 
11-29 10:58:39.315 399-1548/? D/hardware_info: hw_info_append_hw_type : device_name = speaker 
11-29 10:58:39.315 399-1548/? D/audio_hw_primary: disable_snd_device: snd_device(2: speaker) 
11-29 10:58:39.316 399-1548/? V/audio_hw_primary: stop_output_stream: exit: status(0) 
11-29 10:58:39.316 399-1548/? V/audio_hw_primary: out_standby: exit 
11-29 10:58:39.316 399-1548/? V/AudioFlinger_Threads: thread 0xb186a008 type 0 TID 1548 going to sleep 
11-29 10:58:42.112 414-616/? I/ThermalEngine: Sensor:pa_therm0:34000 mC 
11-29 10:58:42.445 2107-2873/? D/InputDispatcher: notifyMotion - action=ACTION_DOWN(0), id=0, tooltype=1, deviceId=5, source=0x1002, policyFlags=0x0, flags=0x0, metaState=0x0, buttonState=0x0, edgeFlags=0x0, eventTime=19045273719000, downTime=19045273719000, 
11-29 10:58:42.446 2107-2872/? D/InputTransport: channel 'ea7a32b com.audiorecorder.company.audiorecorder/com.audiorecorder.company.audiorecorder.mainActivity (server)' : action=ACTION_DOWN(0), id=0, tooltype=1, deviceId=5, source=0x1002, flags=0x0, edgeFlags=0x0, metaState=0x0, buttonState=0x0, downTime=19045273719000, eventTime=19045273719000, pointerCount=1 
11-29 10:58:42.446 29103-29103/com.audiorecorder.company.audiorecorder I/ViewRootImpl: ViewRoot's Touch Event : ACTION_DOWN 
11-29 10:58:42.511 2107-2873/? D/InputDispatcher: notifyMotion - action=ACTION_UP(0), id=0, tooltype=1, deviceId=5, source=0x1002, policyFlags=0x0, flags=0x0, metaState=0x0, buttonState=0x0, edgeFlags=0x0, eventTime=19045339132000, downTime=19045273719000, 
11-29 10:58:42.511 2107-2872/? D/InputTransport: channel 'ea7a32b com.audiorecorder.company.audiorecorder/com.audiorecorder.company.audiorecorder.mainActivity (server)' : action=ACTION_UP(0), id=0, tooltype=1, deviceId=5, source=0x1002, flags=0x0, edgeFlags=0x0, metaState=0x0, buttonState=0x0, downTime=19045273719000, eventTime=19045339132000, pointerCount=1 
11-29 10:58:42.512 29103-29103/com.audiorecorder.company.audiorecorder I/ViewRootImpl: ViewRoot's Touch Event : ACTION_UP 
11-29 10:58:42.534 399-2955/? V/AudioFlinger: registerClient() client 0xb87ca990, pid 29103 
11-29 10:58:42.534 399-2955/? V/AudioFlinger_Threads: sendConfigEvent_l() num events 1 event 0 
11-29 10:58:42.534 399-1548/? V/AudioFlinger_Threads: thread 0xb186a008 type 0 TID 1548 waking up 
11-29 10:58:42.534 399-1548/? V/AudioFlinger_Threads: processConfigEvents_l() remaining events 1 
11-29 10:58:42.535 399-1548/? V/AudioFlinger_Threads: PlaybackThread::ioConfigChanged, thread 0xb186a008, event 0 
11-29 10:58:42.535 399-1548/? V/AudioFlinger_Threads: processConfigEvents_l() DONE thread 0xb186a008 
11-29 10:58:42.536 29103-29114/com.audiorecorder.company.audiorecorder D/AudioSystem: getIoDescriptor: ioHandle = 2, index = -2, mIoDescriptors = 0xb99fbd70 
11-29 10:58:42.536 29103-29114/com.audiorecorder.company.audiorecorder V/AudioSystem: ioConfigChanged: [Update mIoDescriptors] add ioHandle = 2 -> descriptor = 0xa9e3077c 
11-29 10:58:42.536 29103-29114/com.audiorecorder.company.audiorecorder V/AudioSystem: ioConfigChanged() new output opened 2 samplingRate 48000, format 0x1 channel mask 0x3 frameCount 960 deviceId 2 
11-29 10:58:42.537 29103-29103/com.audiorecorder.company.audiorecorder D/AudioRecord: getMinFrameCount 1792 
11-29 10:58:42.551 29103-29103/com.audiorecorder.company.audiorecorder D/AudioRecord: set(): inputSource 1, sampleRate 44100, format 0x1, channelMask 0x10, frameCount 2116800, notificationFrames 0, sessionId 0, transferType 0, flags 0, opPackageName com.audiorecorder.company.audiorecorder uid -1, pid -1 
11-29 10:58:42.551 29103-29103/com.audiorecorder.company.audiorecorder V/AudioRecord: Building AudioRecord with attributes: source=1 flags=0x0 tags=[] 
11-29 10:58:42.552 29103-29103/com.audiorecorder.company.audiorecorder V/AudioRecord: set(): mSessionId 437 
11-29 10:58:42.552 29103-29103/com.audiorecorder.company.audiorecorder D/AudioRecord: set: Create AudioRecordThread 
11-29 10:58:42.553 399-2955/? V/AudioPolicyService: registerClient() client 0xb8744b28, uid 10099 
11-29 10:58:42.553 399-3483/? V/APM::AudioPolicyManager: getInputForAttr() source 1, samplingRate 44100, format 1, channelMask 10,session 437, flags 0 
11-29 10:58:42.553 399-3483/? V/APM::AudioPolicyEngine: getDeviceForInputSource()input source 1, device 80000004 
11-29 10:58:42.554 399-3483/? V/AudioFlinger: openInput(), module 1 Device 80000004, SamplingRate 44100, Format 0x000001, Channels 10, flags 0 
11-29 10:58:42.554 399-3483/? V/audio_hw_primary: adev_open_input_stream: enter 
11-29 10:58:42.554 399-3483/? D/audio_hw_primary: adev_open_input_stream: enter: sample_rate(44100) channel_mask(0x10) devices(0x80000004)  stream_handle(0xb87c58f0) io_handle(438) 
11-29 10:58:42.554 399-3483/? V/audio_hw_primary: adev_open_input_stream: exit 
11-29 10:58:42.554 399-3483/? V/AudioFlinger: openInput_l() openInputStream returned input 0xb87c58f0, SamplingRate 44100, Format 0x1, Channels 10, flags 0, status 0 addr 
11-29 10:58:42.554 399-3483/? V/AudioFlinger: openInput_l() created record thread: ID 438 thread 0xb874d850 
11-29 10:58:42.555 399-3483/? D/AudioSystem: getIoDescriptor: ioHandle = 438, index = -2, mIoDescriptors = 0xb86a44f0 
11-29 10:58:42.555 399-3483/? V/AudioSystem: ioConfigChanged: [Update mIoDescriptors] add ioHandle = 438 -> descriptor = 0xb13d68dc 
11-29 10:58:42.555 399-3483/? V/AudioSystem: ioConfigChanged() new input opened 438 samplingRate 44100, format 0x1 channel mask 0x10 frameCount 896 deviceId 0 
11-29 10:58:42.555 399-29325/? I/AudioFlinger_Threads: AudioFlinger's thread 0xb874d850 ready to run 
11-29 10:58:42.555 2107-3615/? D/AudioSystem: getIoDescriptor: ioHandle = 438, index = -2, mIoDescriptors = 0xb9b82ca0 
11-29 10:58:42.555 2107-3615/? V/AudioSystem: ioConfigChanged: [Update mIoDescriptors] add ioHandle = 438 -> descriptor = 0x9b31e77c 
11-29 10:58:42.555 2107-3615/? V/AudioSystem: ioConfigChanged() new input opened 438 samplingRate 44100, format 0x1 channel mask 0x10 frameCount 896 deviceId 0 
11-29 10:58:42.555 3049-19038/? D/AudioSystem: getIoDescriptor: ioHandle = 438, index = -2, mIoDescriptors = 0xb9e5fea0 
11-29 10:58:42.555 3049-19038/? V/AudioSystem: ioConfigChanged: [Update mIoDescriptors] add ioHandle = 438 -> descriptor = 0x97e4977c 
11-29 10:58:42.555 399-3483/? V/APM::AudioPolicyManager: getInputForAttr() returns input type = 0 
11-29 10:58:42.555 3049-19038/? V/AudioSystem: ioConfigChanged() new input opened 438 samplingRate 44100, format 0x1 channel mask 0x10 frameCount 896 deviceId 0 
11-29 10:58:42.555 399-3483/? V/AudioPolicyService: AudioCommandThread() adding update audio port list 
11-29 10:58:42.555 29103-29115/com.audiorecorder.company.audiorecorder D/AudioSystem: getIoDescriptor: ioHandle = 438, index = -2, mIoDescriptors = 0xb99fbd70 
11-29 10:58:42.555 399-3483/? V/AudioPolicyService: inserting command: 9 at index 0, num commands 0 
11-29 10:58:42.555 29103-29115/com.audiorecorder.company.audiorecorder V/AudioSystem: ioConfigChanged: [Update mIoDescriptors] add ioHandle = 438 -> descriptor = 0xa989777c 
11-29 10:58:42.556 29103-29115/com.audiorecorder.company.audiorecorder V/AudioSystem: ioConfigChanged() new input opened 438 samplingRate 44100, format 0x1 channel mask 0x10 frameCount 896 deviceId 0 
11-29 10:58:42.556 3854-4064/? D/AudioSystem: getIoDescriptor: ioHandle = 438, index = -2, mIoDescriptors = 0xb8c7ce18 
11-29 10:58:42.556 3854-4064/? V/AudioSystem: ioConfigChanged: [Update mIoDescriptors] add ioHandle = 438 -> descriptor = 0xa905577c 
11-29 10:58:42.556 3854-4064/? V/AudioSystem: ioConfigChanged() new input opened 438 samplingRate 44100, format 0x1 channel mask 0x10 frameCount 896 deviceId 0 
11-29 10:58:42.555 399-29325/? D/audio_hw_primary: in_standby: enter: stream (0xb87c58f0) usecase(7: audio-record) 
11-29 10:58:42.556 399-29325/? V/audio_hw_primary: in_standby: exit: status(0) 
11-29 10:58:42.556 399-1482/? V/AudioPolicyService: AudioCommandThread() processing update audio port list 
11-29 10:58:42.556 399-1482/? V/AudioPolicyService: -AudioCommandThread 9 
11-29 10:58:42.556 399-1482/? V/AudioPolicyService: AudioCommandThread() going to sleep 
11-29 10:58:42.558 399-29325/? D/audio_hw_primary: in_standby: enter: stream (0xb87c58f0) usecase(7: audio-record) 
11-29 10:58:42.558 399-29325/? V/audio_hw_primary: in_standby: exit: status(0) 
11-29 10:58:42.558 399-29325/? V/AudioFlinger_Threads: RecordThread: loop stopping 
11-29 10:58:42.561 399-1558/? V/AudioFlinger: openRecord() lSessionId: 437 input 438 
11-29 10:58:42.561 399-1558/? E/AudioFlinger_Tracks: not enough memory for AudioTrack size=8388712 
11-29 10:58:42.561 399-1558/? D/MemoryDealer: AudioTrack (0xb89782f8, size=4198400) 
                0: 0xb8973200 | 0x00000000 | 0x00401000 | F 
               size allocated: 0 (0 KB) 
11-29 10:58:42.561 399-1558/? E/AudioFlinger_Threads: createRecordTrack_l() initCheck failed -12; no control block? 
11-29 10:58:42.561 399-1558/? V/AudioFlinger_Tracks: virtual android::AudioFlinger::RecordThread::RecordTrack::~RecordTrack() 
11-29 10:58:42.561 399-1558/? V/AudioFlinger: removeClient_l() pid 29103, calling pid 29103 
11-29 10:58:42.561 29103-29103/com.audiorecorder.company.audiorecorder E/AudioRecord: AudioFlinger could not create record track, status: -12 
11-29 10:58:42.562 399-2955/? V/APM::AudioPolicyManager: releaseInput() 438 
11-29 10:58:42.562 399-2955/? V/APM::AudioPolicyManager: closeInput(438) 
11-29 10:58:42.562 399-2955/? V/AudioFlinger: closeInput() 438 
11-29 10:58:42.562 399-2955/? D/AudioSystem: getIoDescriptor: ioHandle = 438, index = 1, mIoDescriptors = 0xb86a44f0 
11-29 10:58:42.562 399-2955/? V/AudioSystem: ioConfigChanged() input 438 closed 
11-29 10:58:42.562 399-2955/? V/AudioSystem: ioConfigChanged: [Update mIoDescriptors] remove ioHandle = 438 
11-29 10:58:42.562 399-2955/? V/AudioFlinger_Threads: ThreadBase::exit 
11-29 10:58:42.562 2107-3562/? D/AudioSystem: getIoDescriptor: ioHandle = 438, index = 1, mIoDescriptors = 0xb9b82ca0 
11-29 10:58:42.562 29103-29114/com.audiorecorder.company.audiorecorder D/AudioSystem: getIoDescriptor: ioHandle = 438, index = 1, mIoDescriptors = 0xb99fbd70 
11-29 10:58:42.562 2107-3562/? V/AudioSystem: ioConfigChanged() input 438 closed 
11-29 10:58:42.562 2107-3562/? V/AudioSystem: ioConfigChanged: [Update mIoDescriptors] remove ioHandle = 438 
11-29 10:58:42.562 29103-29114/com.audiorecorder.company.audiorecorder V/AudioSystem: ioConfigChanged() input 438 closed 
11-29 10:58:42.563 29103-29114/com.audiorecorder.company.audiorecorder V/AudioSystem: ioConfigChanged: [Update mIoDescriptors] remove ioHandle = 438 
11-29 10:58:42.563 3049-3078/? D/AudioSystem: getIoDescriptor: ioHandle = 438, index = 1, mIoDescriptors = 0xb9e5fea0 
11-29 10:58:42.563 3049-3078/? V/AudioSystem: ioConfigChanged() input 438 closed 
11-29 10:58:42.563 3049-3078/? V/AudioSystem: ioConfigChanged: [Update mIoDescriptors] remove ioHandle = 438 
11-29 10:58:42.563 399-29325/? V/AudioFlinger_Threads: RecordThread: loop starting 
11-29 10:58:42.564 399-29325/? V/AudioFlinger_Threads: RecordThread 0xb874d850 exiting 
11-29 10:58:42.564 399-2955/? D/audio_hw_primary: adev_close_input_stream: enter:stream_handle(0xb87c58f0) 
11-29 10:58:42.564 399-2955/? D/audio_hw_primary: in_standby: enter: stream (0xb87c58f0) usecase(7: audio-record) 
11-29 10:58:42.564 399-2955/? V/audio_hw_primary: in_standby: exit: status(0) 
11-29 10:58:42.564 3854-3864/? D/AudioSystem: getIoDescriptor: ioHandle = 438, index = 1, mIoDescriptors = 0xb8c7ce18 
11-29 10:58:42.564 399-2955/? V/AudioPolicyService: AudioCommandThread() adding update audio port list 
11-29 10:58:42.564 3854-3864/? V/AudioSystem: ioConfigChanged() input 438 closed 
11-29 10:58:42.564 3854-3864/? V/AudioSystem: ioConfigChanged: [Update mIoDescriptors] remove ioHandle = 438 
11-29 10:58:42.564 399-2955/? V/AudioPolicyService: inserting command: 9 at index 0, num commands 0 
11-29 10:58:42.564 399-2955/? V/APM::AudioPolicyManager: releaseInput() exit 
11-29 10:58:42.564 399-1482/? V/AudioPolicyService: AudioCommandThread() processing update audio port list 
11-29 10:58:42.564 399-1482/? V/AudioPolicyService: -AudioCommandThread 9 
11-29 10:58:42.565 399-1482/? V/AudioPolicyService: AudioCommandThread() going to sleep 
11-29 10:58:42.566 29103-29103/com.audiorecorder.company.audiorecorder E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed with status -12. 
11-29 10:58:42.566 29103-29103/com.audiorecorder.company.audiorecorder E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object. 
11-29 10:58:42.607 2107-3097/? D/PocketDetection: updateScreenWakelockState: mScreenWakeLockList.add(SCREEN_BRIGHT_WAKE_LOCK  'WindowManager' ON_AFTER_RELEASE android (uid=1000, pid=2107, ws=WorkSource{10099}) uptime = 0), mIsScreenWakelockAcquired = true 
11-29 10:58:42.645 29103-29103/com.audiorecorder.company.audiorecorder V/ViewRootImpl: Contents drawing finished : Toast 
11-29 10:58:44.567 2107-3573/? D/InputDispatcher: Window went away: Window{3e54ba2 u0 Toast} 
11-29 10:58:45.538 399-1548/? V/AudioFlinger_Threads: thread 0xb186a008 type 0 TID 1548 going to sleep 
11-29 10:58:46.564 2107-3616/? D/InputDispatcher: Window went away: Window{af07fee u0 Toast} 
11-29 10:58:47.096 2107-2334/? D/PocketDetection: updateScreenWakelockState: mScreenWakeLockList.remove(0) 
11-29 10:58:47.096 2107-2334/? D/PocketDetection: updateScreenWakelockState: mIsScreenWakelockAcquired = false 
11-29 10:58:47.114 414-616/? I/ThermalEngine: Sensor:pa_therm0:34000 mC 

genauer zu sein. Was mache ich falsch?

Hier ist die Klasse, die die Aufnahme tut:

public class RecordingClass { 

    private int lengthInMilliseconds; 

    private AudioRecord recorder; 
    private Thread recordingThread; 
    private Thread timerThread; 

    private static final int RECORDER_SAMPLERATE = 44100; 
    private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT; 
    private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO; 
    private static final int RECORDER_BPP = 16; 
    private static final String AUDIO_RECORDER_FILE_EXT_WAV = ".wav"; 
    private static final int BYTES_PER_SAMPLE = 2; 
    private static final int CHANNELS_MONO = 1; 

    private boolean isRecording = false; 
    private int bufferSize = 0; 

    private static final String TAG = "RecordingClass"; 

    public RecordingClass(int nrOfSeconds) { 
     this.lengthInMilliseconds = nrOfSeconds * 1000; //to get total milliseconds time because the time from UI is in seconds 

     // initialises bufferSize variable 
     getBufferSize(); 
    } 

    public void startRecording() { 

     Toast.makeText(parentActivity, "Recording started for " + lengthInMilliseconds /1000 + " seconds in file '"+fileName+"'", Toast.LENGTH_SHORT).show(); 

     recorder = new AudioRecord(
       MediaRecorder.AudioSource.MIC, 
       RECORDER_SAMPLERATE, 
       RECORDER_CHANNELS, 
       RECORDER_AUDIO_ENCODING, 
       bufferSize); 

     int recorderStatusCode = recorder.getState(); 

     if (recorderStatusCode == AudioRecord.STATE_INITIALIZED) { 

      timerThread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         Thread.sleep(lengthInMilliseconds); 
         stopRecording(); 
         isRecording = false; 
        } catch (InterruptedException e) { 
         return; 
        } 
       } 
      }, "Timer Thread"); 

      //starting recording thread 
      recordingThread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        while(isRecording) 
         writeAudioDataToFile(); 
       } 
      }, "AudioRecorder Thread"); 

      recorder.startRecording(); 

      recordingThread.start(); 
      timerThread.start(); 
     } 
     else 
     { 
      Toast.makeText(parentActivity, "The AudioRecorder was not initialized successfully", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    public void stopRecording() { 

     if(recorder != null) 
     { 
      isRecording = false; 

      if(recorder.getState() == AudioRecord.STATE_INITIALIZED) { 
       recorder.stop(); 
       isRecording = false; 
      } 
      recorder.release(); 

      recorder = null; 
      recordingThread = null; 
     } 

     //initiatePopup(); 
    } 


    /** 
    * Method used to calculate the appropriate buffer size based on the desired audio length in milliseconds 
    * 
    */ 
    private void getBufferSize() { 
     float percentOfASecond = (float) lengthInMilliseconds/1000.0f; 
     int numSamplesRequired = (int) ((float) RECORDER_SAMPLERATE * percentOfASecond); 
     int bufferSize = 0; 

     int minBufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING); 

     // each sample takes two bytes, thus we need a bigger buffer 
     if (RECORDER_AUDIO_ENCODING == AudioFormat.ENCODING_PCM_16BIT) 
     { 
      bufferSize = numSamplesRequired * BYTES_PER_SAMPLE; 
     } 
     else 
     { 
      bufferSize = numSamplesRequired; 
     } 

     if (bufferSize < minBufferSize) 
     { 
      bufferSize = minBufferSize; 
     } 

    } 

    private void writeAudioDataToFile() { 

     //writes audio to file 
    } 

} 

Antwort

0
private void initial() { 
    mRecorder = new MediaRecorder(); 
    File captureDir = new File(FileUtil.getDirpath(), "Audio"); 
    if (!captureDir.exists()){ 
     captureDir.mkdir(); 
    } 
    String filename = getCharacterAndNumber() + ".amr"; 
    File file = new File(captureDir, filename); 

    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); 
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    mRecorder.setOutputFile(file.getAbsolutePath()); 
    mAudioPath.add(file.getAbsolutePath()); 

} 

public void startRecorder() { 
    initial(); 
    try { 
     mRecorder.prepare(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    mRecorder.start(); 
} 

public void stopRecorder() { 
    if (mRecorder != null) { 
     mRecorder.stop(); 
     mRecorder.release(); 
    } 
    mRecorder = null; 
} 

private String getCharacterAndNumber() { 
    String rel = ""; 
    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss"); 
    Date curDate = new Date(System.currentTimeMillis()); 
    rel = formatter.format(curDate); 
    return rel; 
} 

`ve in der Regel auf diese Weise in meinem Projekt verwendet wird, waren Sie bei der Vorbereitung() aufrufen oder Release() im Lebenszyklus;

+0

Danke für die Antwort. AudioRecord hat keine Vorbereitungsmethode. Ich habe tatsächlich die Veröffentlichungsmethode verwendet –

Verwandte Themen