从 byte[] android 转换后 Mp3 文件不播放
Posted
技术标签:
【中文标题】从 byte[] android 转换后 Mp3 文件不播放【英文标题】:Mp3 file is not playing after converting from byte[] android 【发布时间】:2016-11-14 08:48:21 【问题描述】:我只是将一个 mp3 文件转换为字节码,然后将该字节码重新转换为 mp3 并保存到 sdcard,所有过程都成功,但问题是保存的 mp3 文件没有在设备 mp3 播放器上播放,它显示不支持的格式。
下面的代码有问题吗
private void convertBytesToFile(byte[] bytearray)
byte[] bytes = bytearray;
String encoded = Base64.encodeToString(bytes, 0);
// Utilities.log("~~~~~~~~ Encoded: ", encoded);
byte[] decoded = Base64.decode(encoded, 0);
//Utilities.log("~~~~~~~~ Decoded: ", Arrays.toString(decoded));
try
File file2 = new File(Environment.getExternalStorageDirectory() + "/hello-2.mp3");
FileOutputStream os = new FileOutputStream(file2, true);
os.write(decoded);
os.close();
catch (Exception e)
Toast.makeText(this, "Somthing wrong", Toast.LENGTH_SHORT).show();
e.printStackTrace();
或者我缺少的任何东西。 请朋友帮忙。
【问题讨论】:
为什么要在Base64
中编码和解码? Base64
与 mp3
编码有什么关系?
是的,我认为我的过程是错误的。还有其他方法吗?实际上我只是想加入两个 mp3 文件并制作另一个 mp3 文件,这就是为什么我只是尝试使用 Base64 进行编码和解码。还有其他方法可以做到这一点吗?请帮忙。
您可以查看this
也考虑阅读this
让我检查一下.. 谢谢.. :D
【参考方案1】:
你为什么把那个 mp3 转换成 Base64?如果要保存到 SD 卡,请执行以下代码
private void convertBytesToFile(byte[] bytearray)
FileOutputStream fos = new FileOutputStream(Environment.getExternalStorageDirectory() + "/hello-2.mp3");
fos.write(byteArray);
fos.close()
【讨论】:
【参考方案2】:用于播放 MP3(在您的场景中)
private void playMp3(byte[] mp3SoundByteArray)
try
// create temp file that will hold byte array
File tempMp3 = File.createTempFile("fmtemp", "mp3", getCacheDir());
tempMp3.deleteOnExit();
FileOutputStream fos = new FileOutputStream(tempMp3);
fos.write(mp3SoundByteArray);
fos.close();
mediaPlayer.reset();
FileInputStream fis = new FileInputStream(tempMp3);
mediaPlayer.setDataSource(fis.getFD());
mediaPlayer.prepare();
mediaPlayer.start();
catch (IOException ex)
ex.printStackTrace();
【讨论】:
【参考方案3】:android SDK 没有 mp3 编码器。如果要将 byte[] 保存为 .mp3 文件,请使用以下原生库。
https://github.com/naman14/TAndroidLame https://github.com/yhirano/SimpleLameLibForAndroid
【讨论】:
【参考方案4】:正如Jonas 提到的,合并两个 mp3 文件并不像合并它们的字节那么容易,因为文件包含元数据。不过有一个解决方案,您可以使用FFmpeg。您可以使用本机构建或包装器,例如JavaCV。下面是如何使用 JavaCV 合并两个 Mp3 文件的示例
FrameGrabber grabber = new FFmpegFrameGrabber("input.mp3");
grabber.start();
FrameGrabber grabber2 = new FFmpegFrameGrabber("input2.mp3");
grabber2.start();
FrameRecorder recorder = new FFmpegFrameRecorder("output.mp3",
grabber.getAudioChannels());
recorder.setSampleFormat(grabber.getSampleFormat());
recorder.setSampleRate(grabber.getSampleRate());
recorder.start();
Frame frame;
while ((frame = grabber.grabFrame()) != null)
recorder.record(frame);
while ((frame = grabber2.grabFrame()) != null)
recorder.record(frame);
recorder.stop();
grabber.stop();
grabber2.stop();
PS 我假设两个文件的采样率是相同的
【讨论】:
【参考方案5】:https://github.com/adrielcafe/AndroidAudioConverter
(在您的 Android 应用中轻松转换音频文件。支持的格式:AAC、MP3、M4A、WMA、WAV 和 FLAC)
【讨论】:
【参考方案6】:试试这个代码可能会解决你的问题,
private void convertBytesToFile(byte[] bytearray)
try
File outputFile = File.createTempFile("MediaFile", "mp3", getCacheDir());
outputFile.deleteOnExit();
FileOutputStream fileoutputstream = new FileOutputStream(outputmediafile);
fileoutputstream.write(bytearray);
fileoutputstream.close();
catch (IOException ex)
ex.printStackTrace();
在任何媒体播放器中播放媒体文件。
【讨论】:
以上是关于从 byte[] android 转换后 Mp3 文件不播放的主要内容,如果未能解决你的问题,请参考以下文章
java中如何让byte[]与string类型转换后,保持不变
Android:从位图转换为 Byte[] OutOfMemory 错误