Android AudioRecord MIC ऑडियो स्रोत के लिए एक और स्ट्रीम मजबूर कर रहा है


82

अद्यतन 3: मैंने एक और डेवलपर के साथ भागीदारी की है और हमें ऐसा कोई व्यक्ति मिला है जो धन के बड़े योग के लिए ऐसा कर सकता है। उन्होंने हमें एक एपीके एपीके भेजा है और यह काम करने लगता है। हम आगे बढ़ेंगे और स्रोत खरीदेंगे। मुझे उम्मीद है कि हम घोटाला नहीं करेंगे। एक बार पता लगने के बाद मैं अपडेट करूंगा

अपडेट 2: अभी भी इस पर काम कर रहे हैं। अधिक दर्दनाक दिनों के बाद मैं अब लगता है कुछ भी नहीं फैंसी चल रहा है, लेकिन वे केवल AudioFlinger (प्रयोग कर रहे हैं लिंक देखें कॉल करने के लिए देशी ओर) AudioFlinger :: setParameters

मुझे अब यह पता लग रहा है कि मैं AudioFlinger को कॉल करने के लिए एक साधारण JNI कैसे लिख सकता हूं :: set_arameters with audio_io_handle_t ioHandle, const String8 & keyValuePairs

मुझे पता है कि keyValuePairs क्या हो सकता है, लेकिन ऑडियो_io_handle_t के बारे में कोई सुराग नहीं

अपडेट: मेरा मानना ​​है कि सीएएफ के साथ अन्य ऐप भी क्यूसीओएम ऑडियो का उपयोग कर सकते हैं। उसी के लिंक पर देखें Audio_extn_utils_send_audio_calibration

और voice_get_incall_rec_snd_device उसी के लिंक पर

मुझे कोई C / ++ ज्ञान नहीं है। अगर मैं इन तरीकों को मूल पक्ष से कॉल कर सकता हूं तो मुझे कैसे पता चलेगा? चूंकि अन्य ऐप्स कर सकते हैं, एक तरीका होना चाहिए।


मैं 40 से अधिक दिनों के लिए कम से कम 5-6 घंटे एक दिन से संघर्ष कर रहा हूं। मुझे यकीन नहीं है कि यह एसओ द्वारा अनुमति दी गई है, लेकिन मैं सही उत्तर के लिए दान करने में भी खुश हूं।

मेरे पास एक कॉल रिकॉर्डिंग ऐप है जो VOICE_CALL ऑडियो स्रोत का उपयोग करता है। हालांकि ASOP इसे लागू / शासित नहीं करता है, अधिकांश निर्माताओं ने VOICE_CALL और एप्‍लिकेशन लागू किए हैं जो VOICE_CALL ऑडियो स्रोत का उपयोग करते हैं, कई उपकरणों पर ठीक काम किया है। यह एंड्रॉइड 6 तक है।

Google ने इस व्यवहार को Android 6 के साथ बदल दिया। VOICE_CALL ऑडियो स्रोत को खोलने के लिए अब android.permission.CAPTURE_AUDIO_OUTPUT की आवश्यकता है जो केवल सिस्टम अनुप्रयोगों के लिए दी गई है।

यह अनिवार्य रूप से कॉल रिकॉर्डिंग को रोकता है, या इसके पास होना चाहिए। खैर, यह 3 के अलावा मेरा और 200+ अन्य कॉल रिकॉर्डिंग ऐप्स के लिए करता है जिन्होंने इस सीमा के आसपास जाने का एक रास्ता खोज लिया है।

मैं एंड्रॉइड 6 के साथ कई अलग-अलग फोन पर उन ऐप की कोशिश कर रहा हूं और उन्हें रिकॉर्ड करने के तरीके में कुछ विशेषताओं का पता चला है।

वे सभी Android AudioRecord वर्ग का उपयोग करते हैं और MIC ऑडियो स्रोत खोलते हैं। मैं भी करता हूँ; लेकिन मेरे ऐप पर, मुझे केवल एमआईसी से ऑडियो मिलता है, दूसरे पक्ष से नहीं। मुझे जो पता चला है वह बता रहा है कि वे रिकॉर्डिंग शुरू करने से ठीक पहले या बाद में किसी तरह का सिस्टम कॉल जारी कर रहे हैं।

निम्नलिखित लॉग फ़ॉर्म में से एक पर एक नज़र डालें जो सफलतापूर्वक VOICE_CALL को रिकॉर्ड करता है, भले ही वह एमआईसी को रिकॉर्ड करने के लिए उपयोग करता है। ऐसा लगता है कि ऐप कुछ ऐसा है जो एमआईसी में VOICE_CALL ऑडियो स्रोत को मिक्स / रूट / स्ट्रीम / मर्ज करने का प्रबंधन करता है।

- D/audio_hw_primary: in_set_parameters: enter: kvpairs=input_source=1;routing=-2147483644
- D/PermissionCache: checking android.permission.MODIFY_AUDIO_SETTINGS for uid=10286 => granted (432 us)
- D/audio_hw_primary: in_set_parameters: enter: kvpairs=input_source=4;routing=-2147483584;format=1
- D/audio_hw_primary: select_devices: out_snd_device(0: ) in_snd_device(283: voice-dmic-ef)
- D/hardware_info: hw_info_append_hw_type : device_name = voice-dmic-ef
- D/voice: voice_get_incall_rec_snd_device: in_snd_device(283: voice-dmic-ef) incall_record_device(283: voice-dmic-ef)

जैसा कि आप पहली पंक्ति में देख सकते हैं कि यह MIC ऑडियो स्रोत input_source = 1 के साथ शुरू हो रहा है; रूटिंग = -2147483644।

इसके बाद, दूसरी पंक्ति में यह कुछ करता है और android.permission प्राप्त करता है। MODIFY_AUDIO_SETTINGS जो सामान्य अनुमति है और मेरे ऐप में भी है। यह सबसे महत्वपूर्ण हिस्सा लगता है और ऐसा लगता है कि सभी 3 JNI का उपयोग करने के लिए कभी भी वे क्या करते हैं, जो कि VOICE_CALL ऑडियो स्रोत को MIC में स्ट्रीम करने / मर्ज करने के लिए करते हैं और standart AudioRecorder API के साथ रिकॉर्ड करते हैं

अगली पंक्ति में आप देखते हैं कि ऑडियो हार्डवेयर VOICE_CALL (input_source = 4) को मिलाना शुरू कर रहा है, भले ही उन्होंने MIC (1) ऑडियो स्रोत खोला हो।

मैंने मान लिया है कि उन्होंने इस्तेमाल किया है

AudioManager.setParameters("key=value")

और कई रूपों की कोशिश की जैसे कि

AudioManager.setParameters("input_source=4;routing=-2147483584;format=1")

बिना किसी भाग्य के।

फिर, मैंने एंड्रॉइड, एनडीके, ऑडियो रूटिंग, हेडसेट के माध्यम से ऑडियो को मजबूर कर दिया है और सोचा कि वे कुछ हो सकते हैं कि कैसे / ऑडियो / मार्ग / धारा / मर्ज करें VOICE_CALL को वर्तमान AudioRecord सत्र में और (क्योंकि कोई सी ज्ञान नहीं है) शोधन का उपयोग करने की कोशिश की। भाग्य के बिना नीचे (फिर से) कोड के साथ एक ही चीज़ को प्राप्त करने के लिए।

private static void setForceUseOn() {

/*
setForceUse(int usage, int config);

----usage for setForceUse, must match AudioSystem::force_use
public static final int FOR_COMMUNICATION = 0;
public static final int FOR_MEDIA = 1;
public static final int FOR_RECORD = 2;
public static final int FOR_DOCK = 3;
public static final int FOR_SYSTEM = 4;
public static final int FOR_HDMI_SYSTEM_AUDIO = 5;

----device categories config for setForceUse, must match AudioSystem::forced_config
public static final int FORCE_NONE = 0;
public static final int FORCE_SPEAKER = 1;
public static final int FORCE_HEADPHONES = 2;
public static final int FORCE_BT_SCO = 3;
public static final int FORCE_BT_A2DP = 4;
public static final int FORCE_WIRED_ACCESSORY = 5;
public static final int FORCE_BT_CAR_DOCK = 6;
public static final int FORCE_BT_DESK_DOCK = 7;
public static final int FORCE_ANALOG_DOCK = 8;
public static final int FORCE_DIGITAL_DOCK = 9;
public static final int FORCE_NO_BT_A2DP = 10;
public static final int FORCE_SYSTEM_ENFORCED = 11;
public static final int FORCE_HDMI_SYSTEM_AUDIO_ENFORCED = 12;
public static final int FORCE_DEFAULT = FORCE_NONE;


 */

    try {
        Class audioSystemClass = Class.forName("android.media.AudioSystem");
        Method setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class);
        setForceUse.invoke(null, 0, 0);      // setForceUse(FOR_RECORD, FORCE_NONE)


    } catch (Exception e) {
        e.printStackTrace();
    }

}

जाहिर है कि मुझे कुछ याद आ रहा है जो रिकॉर्डिंग को संभव बनाता है।

मैंने भी इस जानकारी को प्राप्त करने के लिए भुगतान करने की पेशकश की, सभी ने इनकार कर दिया। काफी मैंने कहा है। मैं इसे एक बार प्रकाशित करूंगा / अगर मुझे मिल जाए तो!

क्या आपके पास कोई विचार है कि वे क्या कर रहे हैं?


क्या आप उन ऐप्स को लिंक कर सकते हैं जो इसे सफलतापूर्वक करते हैं?
रोस्टर

ज़रूर play.google.com/store/apps/details?id=com.skvalex.callrecorder play.google.com/store/apps/details?id=com.boldbeast.recorder play.google.com/store/apps/details ? आईडी = com.boldbeast.refox वे इस मुद्दे के लिए मूल विधियों का उपयोग नहीं करते हैं
nLL

आपने पिछले एक दो बार पोस्ट किया।
shmosel


1
क्या आपने इसे विघटित करने की कोशिश की है ताकि आप एक झांक सकें? (केवल अनुसंधान उद्देश्यों के लिए;))
बुडा गैवरिल

जवाबों:


9

मुझे और मेरे साथी को वही खरीदने में सक्षम थे जो हम ढूंढ रहे थे। हम सही रास्ते पर थे, आपने देसी तरफ कीवैल्यूएपर्स लगाए।

दुर्भाग्यवश मैं उस कंपनी के लाइसेंस प्रतिबंधों के कारण स्रोत को प्रकाशित नहीं कर सकता, जो हमने उसके लिए लिखी थी


3
एक व्यक्ति का बग दूसरे व्यक्ति की विशेषता है।
एल्विन आर्न्स

7
फिर आप सही हैं nLL ACR है, यदि वह समाधान साझा नहीं कर सकता है तो वह इस स्टैक्वरफ्लो समुदाय का उपयोग क्यों कर रहा है? मुझे लगता है कि यह पूरी तरह से समुदायों के मुख्य मकसद के खिलाफ है। मैं वादा करता हूं कि अगर मुझे समाधान मिलेगा तो मैं समाधान तुरंत पोस्ट कर दूंगा क्योंकि मैं खुले स्रोत में विश्वास करता हूं।
जपनजोत सिंह

2
@ जपानजोटसिंह एक साथ समाधान खोजने देता है
पीटर

3
@ एनएलएल मैं असभ्य लग सकता है, लेकिन भाई यह हम सभी के लिए बहुत निराशा की बात है :-(
जपनजोत सिंह

2
CallRecLib एक लाइब्रेरी है जो एंड्रॉइड 6 github.com/ViktorDegtyarev/CallRecLib
विक्टर डीगिटेयर

0

आपके निष्कर्ष दिलचस्प हैं। मैंने AudioRecordएपीआई को शामिल करने वाली कुछ छोटी परियोजनाओं पर काम किया है। उम्मीद है, निम्नलिखित मदद करेगा:

कहते हैं कि आप एक AudioRecordइंस्टेंस सेटअप करना चाहते हैं ताकि आप 16kHz पर 16-बिट मोनो में रिकॉर्ड कर सकें। आप निम्न की तरह कुछ सहायक विधियों के साथ एक वर्ग बनाकर इसे प्राप्त कर सकते हैं:

public class AudioRecordTool {
        private final int minBufferSize;
        private boolean doRecord = false;
        private final AudioRecord audioRecord;

        public AudioRecordTool() {
            minBufferSize = AudioTrack.getMinBufferSize(16000,
                    AudioFormat.CHANNEL_OUT_MONO,
                    AudioFormat.ENCODING_PCM_16BIT);
            audioRecord = new AudioRecord(
                    MediaRecorder.AudioSource.VOICE_COMMUNICATION,
                    16000,
                    AudioFormat.CHANNEL_IN_MONO,
                    AudioFormat.ENCODING_PCM_16BIT,
                    minBufferSize * 2);
        }

        public void writeAudioToStream(OutputStream audioStream) {
            doRecord = true; //Will dictate if we are recording.
            audioRecord.startRecording();
            byte[] buffer = new byte[minBufferSize * 2];
            while (doRecord) {
                int bytesWritten = audioRecord.read(buffer, 0, buffer.length);
                try {
                    audioStream.write(buffer, 0, bytesWritten);
                } catch (IOException e) {
                    //You can log if you like, or simply ignore it
                   stopRecording();
                }
            }
            //cleanup
            audioRecord.stop();
            audioRecord.release();
        }

        public void stopRecording() {
            doRecord = false;
        }
    }

मैं अनुमान लगा रहा हूं कि आपको वही अनुमतियाँ रखने की आवश्यकता होगी, क्योंकि मार्शमैलो उपयोगकर्ता केवल वही हैं जो हमें निश्चित अनुमतियों तक पहुंच प्रदान करते हैं यदि लगभग सभी शांत नहीं हैं।

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

सौभाग्य।

AudioRecord एपीआई

AudioCaputre एपीआई

MediaRecorder API


1
नहीं, दुर्भाग्य से इसका मेरे सवाल से कोई लेना-देना नहीं है। मैं पहले से AudioReocord क्लास का उपयोग कर रहा हूं और इसके साथ बड़े पैमाने पर काम कर रहा हूं।
nLL

क्या आपने इस समस्या को हल किया है? मुझे वास्तव में एक कार्यशील समाधान की आवश्यकता है :-(
1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.