当我录制手机的麦克风时,我的Mediarecorder
给了我PCM File
作为输出。现在,当尝试收听此File
时,所听到的全部内容都是静态的,我认为,如果我没有正确理解,我会从Mediarecorder
获得一个PCM文件,而不是AAC,我需要添加{{ 1}}标头插入ADTS
,以便能够收听。
我看到了带有自定义PCM
的线程,但是我似乎无法弄清楚我需要在哪里和做什么。
我像这样通过麦克风录音来制作Encoders
:
output File
这是我从private static final int CHANNEL = AudioFormat.CHANNEL_IN_MONO;
private static final int AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private static final int SAMPLE_RATE = 44100; //44.1kHz
private static final int BUFFER_SIZE = 2048;
public Status status = Status.IDLE;
private AudioRecordingHandler arh;
private File outputFile;
private Context context;
/**
* Starts script for running. Needs output file to work!
*/
public void start() {
if (outputFile == null) { return; }
System.out.println("Start reading stream...");
aacEncoder = new AACEncoder(SAMPLE_RATE, micOutputPCM);
new Thread(new Runnable() {
@Override
public void run() {
record.startRecording();
byte[] data = new byte[BUFFER_SIZE];
float[] audioFloatBuffer = new float[BUFFER_SIZE/2];
Yin y = new Yin(SAMPLE_RATE, BUFFER_SIZE/2);
while(status == Status.RECORDING) {
record.read(data, 0, BUFFER_SIZE);
audioFloatBuffer = ConverterUtil.toFloatArray(data, 0, audioFloatBuffer,
0, audioFloatBuffer.length);
PitchDetectionResult pdr = y.getPitch(audioFloatBuffer);
aacEncoder.writeIntoOutputfile(data);
arh.handlePitch(pdr.getPitch());
}
aacEncoder.stopEncoding();
}
}).start();
}
/**
* Stops script
*/
public void stop() {
status = Status.IDLE;
record.stop();
arh.finishedRecording(micOutputPCM);
}
获得byte[]
的方式,并尝试在其中编码ADTS标头。
File
我的问题是,有没有人有一个 public static File addHeaderToAac(File micOutputPCM, File output) throws IOException {
byte[] pcmFile = fullyReadFileToBytes(micOutputPCM);
int bufferSize = 2048;
//addADTSHeader to byte[] and return a File object
return fileWithADTSHeader;
}
public static byte[] fullyReadFileToBytes(File f) throws IOException {
int size = (int) f.length();
byte bytes[] = new byte[size];
byte tmpBuff[] = new byte[size];
FileInputStream fis= new FileInputStream(f);;
try {
int read = fis.read(bytes, 0, size);
if (read < size) {
int remain = size - read;
while (remain > 0) {
read = fis.read(tmpBuff, 0, remain);
System.arraycopy(tmpBuff, 0, bytes, size - remain, read);
remain -= read;
}
}
} catch (IOException e){
throw e;
} finally {
fis.close();
}
return bytes;
}
可以接受Encoder
作为输入并返回File or byte[] or ByteStream
。
因为最终我想制作一个File
,可以在这里找到:https://github.com/sannies/mp4parser
mp4parser AACTrackImpl
此外,如果我缺少一些有关如何进行转换以及应该如何播放的重要信息,那么这些信息也将很有用。
如果我需要提供更多信息来回答这个问题,那么我很乐意这样做。
编辑:
我一直在尝试制作一种可以满足我的需要的编码器,但是到目前为止,我还没有成功。
AACTrackImpl aacTrack2 = new MP3TrackImpl(new FileDataSourceImpl(micOutputPCM));
我正在尝试使用此编码器对 public static File addHeaderToAac(File pcmFile1, File output, Context context) throws IOException {
byte[] pcmFile = fullyReadFileToBytes(pcmFile1);
int bufferSize = 2048;
AACEncoder encoder = new AACEncoder(44100, output);
encoder.encodeAudioFrameToAAC(pcmFile);
return output;
}
进行编码,但是此PCM to AAC
将输出文件写入内存,但是我需要一个对象。当我给我encoder
时,它也给我一个错误:
byte[]
错误来自此行:
W/System.err: at java.nio.ByteBuffer.put(ByteBuffer.java:642)
最后,我的编码器:
inputBuf.put(frameData);