2010-05-27 18 views
15

मैं एक ऐप पर काम कर रहा हूं जो दोनों ऑडियो फाइल रिकॉर्ड करेगा, और उसके बाद रिकॉर्ड होने के बाद उस फ़ाइल को वापस चलाने का विकल्प होगा। यूआई में एक ईक्यू घटक है जो रिकॉर्डिंग के वर्तमान आयाम के सापेक्ष एनिमेट करता है। मुझे एनीमेशन MediaRecorder.getMaxAmplitude() विधि के माध्यम से काम कर रहा है, लेकिन MediaPlayer के साथ ऐसा करने के लिए कोई साधन नहीं मिल रहा है। मुझे पता है कि यह संभव होना चाहिए क्योंकि डिफ़ॉल्ट रूप से संगीत विज़ुअलाइज़ेशन लाइव वॉलपेपर हैं जो इस कार्यक्षमता को निष्पादित करते हैं लेकिन मैं एओएसपी के माध्यम से उस जानकारी को खींचने के किसी भी तरीके से नहीं देख सकता। क्या कोई जानता है कि यह काम कैसे करें?मैं एंड्रॉइड मीडियाप्लेयर में वर्तमान वॉल्यूम/आयाम कैसे प्राप्त करूं?

+3

मैं अपने को स्वीकार कर लिया जवाब से उलझन में हूँ, ऐसा लगता है कि यह टिप्पणी से आपकी समस्या का समाधान नहीं किया था, यह सही है? –

उत्तर

7

मुझे लगता है कि आपको AudioManager का उपयोग करना है। एपीआई में कहा गया है के रूप में यह मात्रा पर नियंत्रण के लिए इस्तेमाल किया जा सकता:

AudioManager मात्रा और रिंगर मोड नियंत्रण के लिए उपयोग प्रदान करता है।

इस कक्षा का उदाहरण प्राप्त करने के लिए Context.getSystemService (Context.AUDIO_SERVICE) का उपयोग करें।

तब मुझे लगता है कि this method उपयोगी होगा।

+8

यही वह जगह है जहां मैं चारों ओर घूम रहा था लेकिन वह विधि वर्तमान में डिवाइस के सेट वॉल्यूम स्तर को वापस लाती है, प्लेबैक स्तर नहीं। –

+0

अंतर कहां है? शायद आप गलत स्ट्रीम की मात्रा मांग रहे हैं? – Janusz

+2

वर्तमान प्लेबैक स्ट्रीम के लिए वॉल्यूम का सवाल नहीं है, लेकिन वास्तविक मीडिया की मात्रा वापस खेली जा रही है। सिर्फ इसलिए कि आपकी संगीत स्ट्रीम वॉल्यूम 60% पर सेट है, इसका मतलब यह नहीं है कि उस पल में ध्वनि की मात्रा उसी स्तर पर है। यह गीत का एक शांत हिस्सा हो सकता है। – MattC

1

मैं थोड़ी देर के लिए something similar करने का कोई तरीका ढूंढ रहा हूं। मैं वास्तव में मीडिया स्ट्रीम पर खेले जाने वाले किसी भी चीज़ की मात्रा/आयाम को देखने में सक्षम होना चाहता हूं, लेकिन मैं वर्तमान में जो कुछ खेल रहा हूं उसके लिए ऐसा करने में सक्षम होने के लिए मैं बसूंगा।

अब तक, मुझे मिला सबसे अच्छा समाधान RingDroid में लागू किया गया है। मैंने कोड को बहुत गहराई से नहीं देखा है, लेकिन ऐसा लगता है कि रिंगड्रॉइड ने इसका साउंडमैप बनाया है, वास्तव में ध्वनि फ़ाइल बिट का थोड़ा सा विश्लेषण कर रहा है।

मैंने एक समान दृष्टिकोण का उपयोग करने पर विचार किया है और फिर एक विज़ुअलाइज़र प्रदर्शित किया है जो ऑडियो फ़ाइल से अलग है, लेकिन सिंक्रनाइज़ गति पर चलता है। हालांकि, ऐसा कुछ ऐसा लगता है जो कुछ आसान हो सकता है।

18

आप Audiomanager class.The कोड की मदद से मीडिया प्लेयर की वर्तमान मात्रा प्राप्त कर सकते हैं इस प्रकार है: -

AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE); 
int volume_level= am.getStreamVolume(AudioManager.STREAM_MUSIC); 

इसी तरह, आप मीडिया player.You के डिफ़ॉल्ट मात्रा सेट करना चाहते हैं कर सकते हैं करना है कि के रूप में की तरह: -

am.setStreamVolume(
      AudioManager.STREAM_MUSIC, 
      volume_level, 
      0); 

कि all..Happy कोडिंग है :)

+3

वह वह नहीं है जो वह पूछ रहा है। वह वर्तमान आउटपुट स्तर की मांग कर रहा है, वॉल्यूम सेटिंग नहीं। –

1

आप DATALINE में getLevel() को लागू करने की है। यह जावा के रूप में बस के करीब है।

इसमें ध्वनि स्ट्रीम बफर से आयाम डेटा के चल रहे औसत की गणना करना शामिल है। इससे बफर तक पहुंचने के लिए बहुत सारे बस यातायात का कारण बनता है, इसलिए अमूर्त विधि के रूप में छोड़ा जाता है।

रूट स्क्वायर मीन आरएमएस एक दृष्टिकोण है: FFT के साथ

https://community.oracle.com/message/5391003

डीएसपी अधिक पूर्ण ध्वनि प्रोफ़ाइल देता है, लेकिन और अधिक CPU संसाधनों खपत करता है। यदि आपको केवल आरएमएस की आवश्यकता है तो पूर्ण डीएसपी पर स्लैम न करें। प्रदर्शन में सुधार के लिए अपने नमूने की गुणवत्ता सीमित करें।

7

आप भाग्य में हैं।विजुअलाइज़र नामक एक वर्ग है जो आपको लगता है कि आप क्या करेंगे।

import android.app.Activity; 
import android.media.audiofx.Visualizer; 
import android.os.Bundle; 
import android.util.Log; 


public class MainActivity extends Activity { 
private Visualizer audioOutput = null; 
public float intensity = 0; //intensity is a value between 0 and 1. The intensity in this case is the system output volume 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    createVisualizer(); 

} 


private void createVisualizer(){ 
    int rate = Visualizer.getMaxCaptureRate(); 
    audioOutput = new Visualizer(0); // get output audio stream 
    audioOutput.setDataCaptureListener(new Visualizer.OnDataCaptureListener() { 
     @Override 
     public void onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate) { 
      intensity = ((float) waveform[0] + 128f)/256; 
      Log.d("vis", String.valueOf(intensity)); 
     } 

     @Override 
     public void onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate) { 

     } 
    },rate , true, false); // waveform not freq data 
    Log.d("rate", String.valueOf(Visualizer.getMaxCaptureRate())); 
    audioOutput.setEnabled(true); 
} 


} 

आप इन अनुमतियों की आवश्यकता होगी:

<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission> 
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"></uses-permission> 
संबंधित मुद्दे