录制的音频无法在Android媒体播放器中播放?
我用下面的代码将文本转换为语音。在我的代码中,我将用户输入存储为.wav格式。当我执行这段代码时,每件事情都很好,当我播放文件时它不会播放。录制的音频无法在Android媒体播放器中播放?
TTS_AudioActivity.java
public class TTS_AudioActivity extends Activity implements OnInitListener {
private int MY_DATA_CHECK_CODE = 0;
private TextToSpeech tts;
String destFileName = "/sdcard/wakeUp.wav";
private EditText inputText;
private Button speakButton, listen;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
inputText = (EditText) findViewById(R.id.editText1);
speakButton = (Button) findViewById(R.id.button1);
listen = (Button) findViewById(R.id.button2);
speakButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String text = inputText.getText().toString();
if (text != null && text.length() > 0) {
HashMap<String, String> myHashRender = new HashMap();
myHashRender.put(
TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, text);
tts.synthesizeToFile(text, myHashRender, destFileName);
Toast.makeText(TTS_AudioActivity.this, "Saying: " + text,
Toast.LENGTH_LONG).show();
tts.speak(text, TextToSpeech.QUEUE_ADD, null);
}
}
});
listen.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
} else {
MediaPlayer mpPlayProgram = new MediaPlayer();
try {
mpPlayProgram
.setDataSource("/sdcard/wakeUp.wav");
mpPlayProgram.prepare();
mpPlayProgram.start();
mpPlayProgram.release();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// MediaPlayer mpPlayProgram = new MediaPlayer();
// try {
// mpPlayProgram.setDataSource(destFileName);
// mpPlayProgram.prepare();
// mpPlayProgram.start();
// mpPlayProgram.release();
//
// } catch (IllegalArgumentException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (IllegalStateException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// tts.addSpeech(null, "/sdcard/wakeUp.wav");
}
});
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == MY_DATA_CHECK_CODE) {
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
// success, create the TTS instance
// tts.isLanguageAvailable(Locale.ENGLISH);
tts = new TextToSpeech(TTS_AudioActivity.this, this);
} else {
// missing data, install it
Intent installIntent = new Intent();
installIntent
.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);
}
}
}
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
Toast.makeText(TTS_AudioActivity.this,
"Text-To-Speech engine is initialized", Toast.LENGTH_LONG)
.show();
} else if (status == TextToSpeech.ERROR) {
Toast.makeText(TTS_AudioActivity.this,
"Error occurred while initializing Text-To-Speech engine",
Toast.LENGTH_LONG).show();
}
}
}
main.xml中
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="54dp"
android:ems="10" >
<requestFocus />
</EditText>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/editText1"
android:layout_centerHorizontal="true"
android:layout_marginTop="42dp"
android:text="Save" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/button1"
android:layout_below="@+id/button1"
android:layout_marginTop="32dp"
android:text="Play" />
</RelativeLayout>
在这里,我保存在SD卡中的文件。当我从SD卡上播放文件时,它不会播放。我如何播放文件。
释放呼叫是问题。
你在start()
之后就叫release()
。 你最好呼叫释放(),当你用MediaPlayer的完成,如文档中说:http://developer.android.com/reference/android/media/MediaPlayer.html
您应仔细阅读本文档,因为MediaPlayer的是种复杂的事情(在我看来)。
顺便说一下,您应该通过使用Environment.getExternalStorageDirectory()
并通过该调用的文件层次来访问您的SD卡。
我根据您的建议进行了更改,遗憾的是它不会工作 – Aerrow 2012-04-03 18:39:57
您是否已经完成了一些调试?为logcat放置一些消息。 您应该检查logcat中mediaRecorder.isPlaying()方法的返回值。 – 2012-04-03 18:45:14
04-04 00:16:56.733:I/System.out(27394):MEDIA PLAYER PATH IS :::::: /mnt/sdcard/wakeUp.wav 04-04 00:16:56.733:D/MediaPlayer (27394):开始() 04-04 00:16:56.733:E/MediaPlayer(27394):开始在状态2中调用 04-04 00:16:56.743:E/MediaPlayer(27394):error( - 38/0) 04-04 00:16:56.743:D/MediaPlayer(27394):start()out 04-04 00:16:56.743:E/MediaPlayer(27394):错误(-38,0) – Aerrow 2012-04-03 18:47:55
你能评论这条线mpPlayProgram.release();
并检查它是否有效。
发布方法应该在您想要发布mediaplayer而不是在播放时调用。
我根据您的建议更改了它不会工作 – Aerrow 2012-04-03 18:39:13
它来自于停止记录器开始后直接释放。 – 2012-04-03 17:45:40