2011-06-17 20 views
23

पर फ़ाइल चलाते समय मैं Audio Capture sample on android.com का उपयोग कर वास्तविक उपकरणों पर ऑडियो रिकॉर्ड और प्ले करने के लिए उपयोग कर रहा हूं। (मोटोरोला टच पैड, और सैमसंग गैलेक्सी एस)।मीडियाप्लेयर त्रुटि -2147483648 आंतरिक स्टोरेज

जब मैं

mFile = Environment.getExternalStorageDirectory().getAbsolutePath(); 

रिकॉर्ड और प्लेबैक काम करता है के रूप में ऑडियो फ़ाइल पथ परिभाषित करते हैं।

लेकिन अगर मैं

के रूप में ऑडियो फ़ाइल सेट
mFile = getFilesDir().getAbsolutePath(); 

OR

mFile = getDir("media", Context.MODE_PRIVATE).getAbsolutePath(); 

या

mFile = getDir("media", Context.MODE_WORLD_READABLE).getAbsolutePath(); 

रिकॉर्ड काम करने के लिए लगता है, लेकिन प्लेबैक

के साथ विफल

त्रुटि/MediaPlayer (4559): त्रुटि (1, -2147483648)

क्या समारोह केवल मेरे ऐप भीतर प्लेबैक के लिए ऑडियो फाइलों को बचाने के लिए सही आंतरिक भंडारण निर्देशिका वापस आ जाएगी?

प्रश्न में कोड मेरे onCreate फ़ंक्शन में है। (उदाहरण के लिए, वे यह निर्माता में है, लेकिन मैं यह onCreate में ले जाया गया क्योंकि अन्यथा getFilesDir() और getDir() काम करने के लिए कोई संदर्भ नहीं है।)

public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 

// mFile = Environment.getExternalStorageDirectory().getAbsolutePath();  // OK 
// mFile = getFilesDir().getAbsolutePath();         // BAD 
// mFile = getDir("media", Context.MODE_PRIVATE).getAbsolutePath();   // BAD 
    mFile = getDir("media", Context.MODE_WORLD_READABLE).getAbsolutePath(); // BAD 
    mFile += "/audiorecordtest.3gp"; 
    Log.e(LOG_TAG,mFile); 
// ... 
} 

जब मैं बाह्य भंडारण के लिए रिकॉर्ड (और प्लेबैक ठीक से काम करता है), लॉग इस तरह दिखता है:

06-17 10:08:28.380: DEBUG/AudioHardwareTegra(85): getInputBufferSize: returns 320 for rate 8000 
06-17 10:08:28.380: INFO/MPEG4Writer(85): limits: 2147483647/0 bytes/us, bit rate: 12200 bps and the estimated moov size 3072 bytes 
06-17 10:08:28.440: DEBUG/AudioHardwareTegra(85): setDriver_l: Analog mic? yes. Bluetooth? no. 
06-17 10:08:28.970: WARN/AudioFlinger(85): RecordThread: buffer overflow 
06-17 10:08:28.970: INFO/MPEG4Writer(85): setStartTimestampUs: 83095 
06-17 10:08:28.970: INFO/MPEG4Writer(85): Earliest track starting time: 83095 
06-17 10:08:34.020: DEBUG/MPEG4Writer(85): Stopping Audio track 
06-17 10:08:34.080: WARN/AudioFlinger(85): RecordThread: buffer overflow 
06-17 10:08:34.090: INFO/MPEG4Writer(85): Received total/0-length (257/0) buffers and encoded 257 frames. - audio 
06-17 10:08:34.090: INFO/MPEG4Writer(85): Audio track drift time: -385311 us 
06-17 10:08:34.090: DEBUG/MPEG4Writer(85): Stopping Audio track source 
06-17 10:08:34.090: DEBUG/MPEG4Writer(85): Audio track stopped 
06-17 10:08:34.090: DEBUG/MPEG4Writer(85): Stopping writer thread 
06-17 10:08:34.090: DEBUG/MPEG4Writer(85): 0 chunks are written in the last batch 
06-17 10:08:34.090: DEBUG/MPEG4Writer(85): Writer thread stopped 
06-17 10:08:34.090: DEBUG/MPEG4Writer(85): Stopping Audio track 
06-17 10:08:34.100: WARN/MediaRecorder(4559): mediarecorder went away with unhandled events 
06-17 10:08:40.740: INFO/StagefrightPlayer(85): setDataSource('/data/data/my.record.test/files/audiorecordtest.3gp') 
06-17 10:08:40.740: ERROR/MediaPlayer(4559): error (1, -2147483648) 
06-17 10:08:40.740: ERROR/AudioRecordTest(4559): prepare() failed 

लॉग नज़र एल की रिकॉर्डिंग वर्गों:

06-17 10:07:30.890: DEBUG/AudioHardwareTegra(85): getInputBufferSize: returns 320 for rate 8000 
06-17 10:07:30.900: INFO/MPEG4Writer(85): limits: 2147483647/0 bytes/us, bit rate: 12200 bps and the estimated moov size 3072 bytes 
06-17 10:07:30.960: DEBUG/AudioHardwareTegra(85): setDriver_l: Analog mic? yes. Bluetooth? no. 
06-17 10:07:31.100: WARN/AudioFlinger(85): RecordThread: buffer overflow 
06-17 10:07:31.100: INFO/MPEG4Writer(85): setStartTimestampUs: 86380 
06-17 10:07:31.100: INFO/MPEG4Writer(85): Earliest track starting time: 86380 
06-17 10:07:34.350: DEBUG/MPEG4Writer(85): Stopping Audio track 
06-17 10:07:34.450: INFO/MPEG4Writer(85): Received total/0-length (167/0) buffers and encoded 167 frames. - audio 
06-17 10:07:34.450: INFO/MPEG4Writer(85): Audio track drift time: -20309 us 
06-17 10:07:34.450: DEBUG/MPEG4Writer(85): Stopping Audio track source 
06-17 10:07:34.470: DEBUG/MPEG4Writer(85): Audio track stopped 
06-17 10:07:34.470: DEBUG/MPEG4Writer(85): Stopping writer thread 
06-17 10:07:34.470: DEBUG/MPEG4Writer(85): 0 chunks are written in the last batch 
06-17 10:07:34.470: DEBUG/MPEG4Writer(85): Writer thread stopped 
06-17 10:07:34.470: DEBUG/MPEG4Writer(85): Stopping Audio track 
06-17 10:07:34.470: WARN/MediaRecorder(4472): mediarecorder went away with unhandled events 
06-17 10:07:40.310: INFO/StagefrightPlayer(85): setDataSource('/mnt/sdcard/audiorecordtest.3gp') 
06-17 10:07:46.590: DEBUG/AudioHardwareTegra(85): AudioStreamOutTegra::flush() 
06-17 10:07:46.670: DEBUG/AudioHardwareTegra(85): AudioStreamOutTegra::flush() returns 

जब मैं (आंतरिक भंडारण करने के लिए रिकॉर्ड और यह विफल रहता है), लॉग इस तरह दिखता है तर्कसंगत रूप से मेरे लिए, इसलिए मुझे लगता है कि यह रिकॉर्डिंग है, लेकिन मुझे नहीं पता कि इसे चलाने के अलावा फ़ाइल को किसी भी तरह से कैसे जांचें। ;-)

त्रुटि लॉग समान है जब मैं getDir() का उपयोग करता हूं।

उत्तर

23

Thanks to gtkandroid:

mPlayer.setDataSource(mFile); के बजाय मैं इस किया था:

FileInputStream fileInputStream = new FileInputStream(mFile); 
mPlayer.setDataSource(fileInputStream.getFD());   
fileInputStream.close(); 
mPlayer.prepare(); 
+0

.close() सुझाव के लिए धन्यवाद दोस्तों; मैंने अभी इसे अपने जवाब में जोड़ा है। –

3

Tim Crowley सही है।बेहतर अभ्यास धारा बंद करने के लिए, इस तरह है:

FileInputStream stream = new FileInputStream(path); 
mediaPlayer.setDataSource(stream.getFD()); 
stream.close(); 

यह विधि के दस्तावेज में उल्लेख किया गया है:

android.media.MediaPlayer.setDataSource(FileDescriptor fd)

सेट डेटा स्रोत (FileDescriptor) का उपयोग करें। यह कॉलर की की जिम्मेदारी फ़ाइल डिस्क्रिप्टर है। के रूप में ऐसा करने के लिए सुरक्षित है क्योंकि यह कॉल लौटाता है।

संबंधित मुद्दे