将音频的 ByteArray 保存到音频文件中
Posted
技术标签:
【中文标题】将音频的 ByteArray 保存到音频文件中【英文标题】:Saving ByteArray of audio into an Audio File 【发布时间】:2014-03-31 16:18:06 【问题描述】:我正在开发一个测试应用程序以在 android 上集成 soundtouch(一个开源音频处理库)。
我的测试应用已经可以接收来自麦克风的输入,通过 soundtouch 传递音频并将处理后的音频输出到 AudioTrack 实例。
我的问题是,如何将 AudioTrack 的输出更改为设备上的新文件?
这是我的应用程序中的相关代码(我将 soundtouch 的输出处理到 AudioTrack 的输入中)
// the following code is a stripped down version of my code
// in no way its supposed to compile or work. Its here for reference purposes
// pre-conditions
// parameters - input : byte[]
soundTouchJNIInstance.putButes(input);
int bytesReceived = soundTouchJNIInstance.getBytes(input);
audioTrackInstance.write(input, 0, bytesReceived);
关于如何解决这个问题的任何想法?谢谢!
【问题讨论】:
【参考方案1】:希望您已经从麦克风获取输入声音并保存在文件中。
首先,将 JNI 库导入您的 oncreate 方法:
System.loadLibrary("soundtouch");
System.loadLibrary("soundstretch");
Soundstrech 库:
public class AndroidJNI extends SoundStretch
public final static SoundStretch soundStretch = new SoundStretch();
现在您需要使用输入文件路径和所需的输出文件调用 soundstrech.process 以将处理后的语音存储为参数:
AndroidJNI.soundStretch.process(dataPath + "inputFile.wav", dataPath + "outputFile.wav", tempo, pitch, rate);
File sound = new File(dataPath + "outputFile.wav");
File sound2 = new File(dataPath + "inputFile.wav");
Uri soundUri = Uri.fromFile(sound);
soundUri 可以作为来源提供给媒体播放器进行播放:
MediaPlayer mediaPlayer = MediaPlayer.create(this, soundUri);
mediaPlayer.start();
还要注意,记录的样本大小应该通过声明一个采样率数组来动态选择:
int[] sampleRates = 44100, 22050, 11025, 8000
【讨论】:
我无法获得 SoundStretch 课程。我该怎么办??我得到 SoundStretch 无法解析为类型,因为导入不起作用 import org.tecunhuman.jni.SoundStretch;【参考方案2】:byteArray 最好的写法:
public void writeToFile(byte[] array)
try
String path = "Your path.mp3";
File file = new File(path);
if (!file.exists())
file.createNewFile();
FileOutputStream stream = new FileOutputStream(path);
stream.write(array);
catch (FileNotFoundException e1)
e1.printStackTrace();
【讨论】:
【参考方案3】:我根本不知道声音触摸,我提供的链接也没有涉及 jni 代码,但如果它对你有任何帮助,你可以看看它:http://i-liger.com/article/android-wav-audio-recording
【讨论】:
【参考方案4】:我认为实现此目的的最佳方法是将音频转换为 byte[]
数组。假设您已经这样做了(如果没有,请对其进行评论,我将提供一个示例),上面的代码应该可以工作。这假设您将其保存在名为 AudioRecording
的新目录中的外部 sdcard
中,并将其另存为 audiofile.mp3
。
final File soundFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "AudioRecording/");
soundFile.mkdirs();
final File outFile = new File(soundFile, 'audiofile.mp3');
try
final FileOutputStream output = new FileOutputStream(outFile);
output.write(yourByteArrayWithYourAudioFileConverted);
output.close();
catch (FileNotFoundException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
mkdirs()
方法将尝试构建所有缺少的父目录。因此,如果您计划存储在 2 级或更多级别的深度目录中,这将创建所有结构。
【讨论】:
【参考方案5】:我使用一个简单的测试代码 sn-p 来编写我的音频字节数组:
public void saveAudio(byte[] array, string pathAndName)
FileOutputStream stream = new FileOutputStream(pathAndName);
try
stream.write(array);
finally
stream.close();
如果您要在生产环境中使用它,您可能需要添加一些异常处理,但每当我处于开发阶段或个人非发布项目时,我都会利用上述方法来保存音频。
附录
经过一些简短的思考,我已将我的 sn-p 更改为以下稍微更健壮的格式:
public void saveAudio(byte[] array, string pathAndName)
try (FileOutputStream stream= new FileOutputStream(pathAndName))
stream.write(array);
catch (IOException ioe)
ioe.printStackTrace();
finally
stream.close();
【讨论】:
【参考方案6】:您可以使用使用 SequenceInputStream 的方法,在我的应用程序中,我只是将 MP3 文件合并为一个并使用 JNI Library MPG123 播放,但我使用 MediaPlayer 测试文件没有问题。
这段代码不是最好的,但它可以工作......
private void mergeSongs(File mergedFile,File...mp3Files)
FileInputStream fisToFinal = null;
FileOutputStream fos = null;
try
fos = new FileOutputStream(mergedFile);
fisToFinal = new FileInputStream(mergedFile);
for(File mp3File:mp3Files)
if(!mp3File.exists())
continue;
FileInputStream fisSong = new FileInputStream(mp3File);
SequenceInputStream sis = new SequenceInputStream(fisToFinal, fisSong);
byte[] buf = new byte[1024];
try
for (int readNum; (readNum = fisSong.read(buf)) != -1;)
fos.write(buf, 0, readNum);
finally
if(fisSong!=null)
fisSong.close();
if(sis!=null)
sis.close();
catch (IOException e)
e.printStackTrace();
finally
try
if(fos!=null)
fos.flush();
fos.close();
if(fisToFinal!=null)
fisToFinal.close();
catch (IOException e)
e.printStackTrace();
【讨论】:
以上是关于将音频的 ByteArray 保存到音频文件中的主要内容,如果未能解决你的问题,请参考以下文章