Android将AAC ADTS添加到Mediarecorder PCM

时间:2018-07-22 20:57:57

标签: java android aac encoder adts

当我录制手机的麦克风时,我的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);

0 个答案:

没有答案