Не удается открыть файл из хранилища с помощью сверхмощного SDK

Я использую сверхмощный SDK для воспроизведения аудиофайлов. Для этого я использую

player->open("/storage/emulated/0/0567894638.mp3");

Я также добавляю разрешение READ_EXTERNAL_STORAGE.

Проблема в том, что ошибки не отображаются, но файл не воспроизводится. Если я возьму этот же файл из ассетов, то он успешно проигрывается. Пожалуйста, кто-нибудь, скажите мне, какие изменения я делаю для игры с внутренней памяти?


person nidhi    schedule 06.07.2018    source источник
comment
Для Android 6+ вам нужно добавить код, чтобы пользователь мог подтвердить запрошенное разрешение во время выполнения.   -  person greenapps    schedule 06.07.2018
comment
Я также добавил разрешение на выполнение, но он не может открыть файл.   -  person nidhi    schedule 06.07.2018
comment
Это сработало, но теперь я хочу указать этот путь из java-файла, где SuperpoweredExample(sampleRate, bufferSize, getPackageResourcePath(), fileOffset, fileLength); здесь.....   -  person nidhi    schedule 06.07.2018
comment
есть ли причина использовать superpower sdk?   -  person Vinesh Chauhan    schedule 06.07.2018
comment
Это мощный SDK и простой в использовании. Используя это, мы можем редактировать музыку, например, изменять высоту тона и т. д. Без этого результат не будет лучше.   -  person nidhi    schedule 06.07.2018
comment
Вы написали какой-либо провайдер явно?   -  person Radhey    schedule 12.11.2018
comment
Нет, я не добавляю провайдера.   -  person nidhi    schedule 12.11.2018


Ответы (2)


String file_path = "/storage/emulated/0/kal.mp3";
File f = new File("" + file_path);
fileLength = (int) f.length();

Pair<Integer, Integer> deviceAudioInfo = getDeviceAudioInfo();
Integer sampleRate = deviceAudioInfo.first;
Integer bufferSize = deviceAudioInfo.second;
SuperpoweredExample(sampleRate, bufferSize, file_path, 0, fileLength);


SuperpoweredExample::SuperpoweredExample(unsigned int samplerate, unsigned int buffersize,
                                     const char *path, int fileOffset, int fileLength) : volume(1.0f * headroom) {
stereoBuffer = (float *) memalign(16, (buffersize + 16) * sizeof(float) * 2);

player = new SuperpoweredAdvancedAudioPlayer(&player, NULL, samplerate, 0);
player->open(path);

audioSystem = new SuperpoweredAndroidAudioIO(samplerate, buffersize, false, true,
                                             audioProcessing,
                                             this, -1, SL_ANDROID_STREAM_MEDIA, buffersize * 2);
}

добавить разрешение READ_EXTERNAL_STORAGE

person Hardip    schedule 11.07.2018

Теперь это работает. Я пытаюсь изменить высоту тона и темп с помощью Superpowered sdk. Я пытался получить mp3-файл с устройства хранения телефона. Я использую superpowered-ndk-example для выполнения моей работы. Ниже приведен пример кода.

В методе onCreate

 this.binding.setPlaying(playing);
    // Get the device's sample rate and buffer size to enable low-latency Android audio output, if available.
    Pair<Integer, Integer> deviceAudioInfo = getDeviceAudioInfo();
    Integer sampleRate = deviceAudioInfo.first;
    Integer bufferSize = deviceAudioInfo.second;
    Pair<Integer, Integer> trackLocationInfo = getTrackLocationInfo();
    Integer fileOffset = trackLocationInfo.first;
    Integer fileLength = trackLocationInfo.second;
    String pat = "/storage/emulated/0/rec.wav";
    // Arguments: path to the APK file, offset and length of the two resource files, sample rate, audio buffer size. 
    // this code works with assets         
    SuperpoweredExample(sampleRate, bufferSize, getPackageResourcePath(), fileOffset, fileLength);
    //this code works for storage devices
    SuperpoweredExample(sampleRate, bufferSize, pat, fileOffset, fileLength);
     setupViews();

необходимые методы

 private void setupViews() {
            binding.btnPlayPause.setOnClickListener((view) -> {
                setPlaying(!playing);
            });    
            binding.sbPitch.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    onPitchChanged(progress - 12);
                }    
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {

                }    
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {    
                }
            });    
            binding.sbTrackProgress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    seekTo(progress);
                    if (progress == seekBar.getMax()) {
                        setPlaying(!playing);
                    }
                }    
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {

                }    
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                    seekTo(seekBar.getProgress() / 100.0f);
                }
            });    
            binding.radioGroup.check(binding.rbNormalTime.getId());
            binding.radioGroup.setOnCheckedChangeListener((group, checkedId) -> {
                switch (checkedId) {
                    case R.id.rb_slow_down:
                        onTempoSelected(TEMPO_HALF);
                        break;
                    case R.id.rb_normal_time:
                        onTempoSelected(TEMPO_NORMAL);
                        break;
                    case R.id.rb_speed_up:
                        onTempoSelected(TEMPO_DOUBLE);
                        break;
                    default:
                        onTempoSelected(TEMPO_NORMAL);
                        break;
                }
            });
        }    
        private void setPlaying(boolean playing) {
            this.playing = playing;
            this.binding.setPlaying(this.playing);
            onPlayPause(this.playing);
        }    
        private Pair<Integer, Integer> getDeviceAudioInfo() {
            String samplerateString;
            String buffersizeString;

            AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
            samplerateString = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
            buffersizeString = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);

            if (samplerateString == null) samplerateString = "44100";
            if (buffersizeString == null) buffersizeString = "512";

            return new Pair<>(Integer.parseInt(samplerateString), Integer.parseInt(buffersizeString));
        }    
        private Pair<Integer, Integer> getTrackLocationInfo() {
            AssetFileDescriptor fd;
            Pair<Integer, Integer> trackLocationInfo = null;

            try {
                fd = getTrackAsset();
                int fileOffset = (int) fd.getStartOffset();
                int fileLength = (int) fd.getLength();
                trackLocationInfo = new Pair<>(fileOffset, fileLength);
            } catch (IOException e) {
                e.printStackTrace();
            }    
            return trackLocationInfo;
        }    
        private AssetFileDescriptor getTrackAsset() throws IOException {
            return getAssets().openFd("kal.mp3");
        }    
        private native void SuperpoweredExample(int samplerate, int buffersize, String apkPath,
                                                int fileOffset, int fileLength);

        private native void onPlayPause(boolean play);

        private native void seekTo(double positionPercent);

        private native void onPitchChanged(int pitchValue);

        private native void onTempoSelected(int tempoValue);

        public native String stringFromJNI();

Эти нативные методы используются в файле SuperpoweredExample.cpp. android-apps-21550cdd86a" rel="nofollow noreferrer">это

изменить player->open(path, fileOffset, fileLength); на player->open(path);

Он работает для изменения высоты тона и тампо.

person nidhi    schedule 06.07.2018