2017-01-02 2 views
2

Я работаю со сверхмощным sdk для обработки звука, за исключением файла из активов, используя следующий код.Чтение аудиофайла из памяти устройства вместо Assets

AssetFileDescriptor fd0 = getResources().openRawResourceFd(R.raw.recorded_audio); 
int fileAoffset = (int) fd0.getStartOffset(), fileAlength = (int) fd0.getLength(); 

Вышеуказанные значения передаются функции как

SuperpoweredExample(Integer.parseInt(samplerateString), Integer.parseInt(buffersizeString), getPackageResourcePath(), fileAoffset, fileAlength); 

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

+0

Вы решили это? Мне интересно, потому что я хотел бы загрузить wav из ram, поскольку мои .wav-файлы хранятся в активах, и кажется, что Superpowered может загружать только файлы .wav из файловых путей? –

ответ

1

Пробуйте этот код, он использует класс MediaPlayer.

package com.example.audiomediaplayer1; 

import android.media.MediaPlayer; 
import android.net.Uri; 
import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.widget.MediaController; 
import android.widget.VideoView; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     MediaPlayer mp=new MediaPlayer(); 
     try{ 
      mp.setDataSource("/sdcard/Music/maine.mp3");//Write your location here 
      mp.prepare(); 
      mp.start(); 

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

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

} 

или этот короткий и простой внешний внешний вид вместе с дорожкой.

String filePath = Environment.getExternalStorageDirectory()+"/yourfolderNAme/yopurfile.mp3"; 
    mediaPlayer = new MediaPlayer(); 
    mediaPlayer.setDataSource(filePath); 
    mediaPlayer.prepare(); 
    mediaPlayer.start(); 

надеюсь, что это сработает для вас.

+0

Спасибо за ваше предложение, но это не относится к моей проблеме, так как я сказал, что использую NDK и супермощный sdk, выше кода передают три атрибута этому коду C++, и это работает, но он читается из активов. Поэтому мне нужно получить смещение и длину файла из внешнего хранилища. –

1

Не проверял, но вы можете попробовать некоторые вещи, как этот

String filepath="/mnt/external_sd/file.txt"; //your file path 
      try { 
       FileInputStream fileInputStream=new FileInputStream(filepath); 

       FileDescriptor fd0 = fileInputStream.getFD(); 

      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
+1

Спасибо за ваш ответ, я попытался это сделать, но если вы проверите FileDescriptor, у него нет метода, который мог бы рассчитать смещение или длину файла. В то время как RandomAccessFile имеет так, но это не поддерживает ни одно из приложений, а также сбоев приложений из-за неправильного смещения –

3

Просто передайте свой путь к файлу в виде строки методы сверхмощных открытого(). На этот раз нет необходимости в смещении файлов и длине файла, так как на этот раз ваш файл является «полным» файлом, а не частью файла. Возможно, вам вообще не нужна Java.

+0

Большое спасибо за ваш добрый ответ. На самом деле я делаю это в Android-проекте. Вот почему спрашивать здесь. Если вы можете поделиться любым примером кода, который будет высоко оценен. Спасибо –

+0

Я очень ценю вашу помощь и поддержку. Я пробовал этот метод, используя этот путь, например: Environment.getExternalStorageDirectory(). GetPath() + "/ registered_audio.wav" Также преобразовывает это в файл, а затем получает абсолютный путь файла, кроткий путь и относительный путь, но, к сожалению, ничего не работает и приложение постоянно терпит крах. Вы можете помочь. Кроме того, мне нужно написать файл после применения эффектов во внешнем хранилище, вам ценная информация будет высоко оценена. –

+0

Абсолютный путь должен работать. Если вы указали неправильный путь, то он все равно не должен разрушать приложение, в этом случае вы получите открытую ошибку. Не забудьте не передавать какую-либо другую переменную в открытый метод в этом случае «прямой загрузки». Таким образом, он будет выглядеть как player-> open ("path_to_file"); –

0
void SuperpoweredExample::setPlayerA(const char *path) { 

playerA->open(path,0,0); 

} 

Просто отправьте путь к файлу в виде строки.

Пример "/sdcard/sample.mp3"

Смежные вопросы