Java Android MediaPlayer可以在压缩文件中播放音频吗?
代码编辑: 我正在为Android开发一个字典应用程序。我已经成功地让应用程序发出每个被查找的单词的发音。代码如下:Java Android MediaPlayer可以在压缩文件中播放音频吗?,java,android,eclipse,audio,media-player,Java,Android,Eclipse,Audio,Media Player,代码编辑: 我正在为Android开发一个字典应用程序。我已经成功地让应用程序发出每个被查找的单词的发音。代码如下: btnPronounce.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-genera
btnPronounce.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//Log.i(MAIN_TAG,"Start pronounciation ...");
btnPronounce.setEnabled(false);
String currentWord = edWord.getText().toString().toLowerCase();
try {
ZipFile zip = new ZipFile("/sdcard/app_folder/sound/zip_test.zip");
ZipEntry entry = zip.getEntry(currentWord);
if (entry != null) {
InputStream in = zip.getInputStream(entry);
// see Note #3.
File tempFile = File.createTempFile("_AUDIO_", ".wav");
FileOutputStream out = new FileOutputStream(tempFile);
IOUtils.copy(in, out);
// do something with tempFile (like play it)
File f = tempFile;
try {
if (f.exists())
{
Log.i(MAIN_TAG,"Audio file found!");
MediaPlayer mp = new MediaPlayer();
mp.prepare();
mp.setLooping(false);
mp.start();
while (mp.getCurrentPosition() < mp.getDuration());
mp.stop();
mp.release();
Log.i(MAIN_TAG,"Pronounciation finished!");
}
else
{
Log.i(MAIN_TAG,"File doesn't exist!!");
}
}
catch (IOException e)
{
Log.i(MAIN_TAG,e.toString());
}
btnPronounce.setEnabled(true); }
else {
// no such entry in the zip
}
} catch (IOException e) {
// handle your exception cases...
e.printStackTrace();
}
}
});
btnpronunce.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
//Log.i(主标签,“开始发音…”);
btnpronunce.setEnabled(false);
字符串currentWord=edWord.getText().toString().toLowerCase();
试一试{
ZipFile zip=新ZipFile(“/sdcard/app_folder/sound/zip_test.zip”);
ZipEntry entry=zip.getEntry(currentWord);
if(条目!=null){
InputStream in=zip.getInputStream(条目);
//见注3。
File tempFile=File.createTempFile(“.wav”);
FileOutputStream out=新的FileOutputStream(tempFile);
IOUtils.copy(输入、输出);
//使用tempFile执行某些操作(如播放)
文件f=临时文件;
试一试{
如果(f.exists())
{
Log.i(主标签“找到音频文件!”);
MediaPlayer mp=新的MediaPlayer();
mp.prepare();
mp.设置循环(错误);
mp.start();
而(mp.getCurrentPosition()
但问题是一个文件夹中有太多的WAV文件,所有这些文件都被安卓设备视为音乐文件。因此,索引这些文件需要很长时间。此外,索引和用户浏览有时会迫使应用程序崩溃
因此,我只是想知道是否可以通过编程实现以下功能:
非常感谢。您可以结合使用或和
java.io
文件操作从zip读取必要的数据,创建临时文件,并使用MediaPlayer
播放这些文件
或者,您可以只发送而不发送一个50亿字节的APK
编辑-请求示例:
注:
ZipInputStream
查找的内容,而ZipFile
只允许您按姓名询问所需内容。我不确定使用这两种方法对性能的影响(如果有的话)你应该考虑的一个选择是当用户想要听发音时下载单独的声音文件。这应该会减少文件大小,尽管这确实意味着在没有互联网的情况下你不能听发音。
我不确定mediaplayer是否支持流,但如果支持流,你可以使用ZipInputStream()来实现,而这不一定是最佳解决方案,引入一个大的mp3/wav文件并使用position/length只播放其中的一部分应该不会有问题。如果您采用这种方法,那么使用android.media.SoundPool可能会更好。特别是如果SoundPool.load(..)方法将文件位置作为参数(而不是示例中的声音位置)…文本到语音库不是一个选项吗?非常感谢您的所有评论和建议。我希望单词由人类实际发音,所以文本到语音库可能不是一个选项。ZipInputStream似乎是一个解决方案。非常感谢。我现在就按照你的建议试试。这对我来说是很新鲜的。因此,关于我上面的代码,您可以举一个例子,使用ZipInputStream
和java.io
读取单个压缩文件中的音频文件。“非常感谢。非常感谢,”克里斯·卡什韦尔说。我试图套用你的建议,但它不发音
try {
ZipFile zip = new ZipFile("someZipFile.zip");
ZipEntry entry = zip.getEntry(fileName);
if (entry != null) {
InputStream in = zip.getInputStream(entry);
// see Note #3.
File tempFile = File.createTempFile("_AUDIO_", ".wav");
FileOutputStream out = new FileOutputStream(tempFile);
IOUtils.copy(in, out);
// do something with tempFile (like play it)
} else {
// no such entry in the zip
}
} catch (IOException e) {
// handle your exception cases...
e.printStackTrace();
}