AndroidアプリプロジェクトでAACエンコードを有効にするためにFAACからJNIを使用しようとしています。すべてうまくいっているようですが、エンコード部分は、うーん、むしろ変です。私は、オーディオのプログラミングに慣れていないんだということを認め、すでに数日間ソリューションや回答を探しますが、まだ答えを見つけてはなりません。FAACを使用してm4aにエンコードされたRAW PCMデータは認識できませんか?
状況があり、私はのは、「temp.pcm」と言ってみましょう、MediaRecordを使用してRAW PCMデータに音声を記録し、一時ファイルにファイルを保存しました。次いで、AACの.M4Aファイルにそれを符号化するために以下のコードを使用して。 問題は、エンコードされたファイルが保存され、サイズは正常に見えるが、Mplayerのか、他のメディアプレーヤーで認識することはできません。それらを再生すると、サポートされていない形式のようなエラーが表示されます。エンコードされたファイルの構造が間違っているようです。
私はこれについて何の手がかりもありません。誰もこれを前に試しましたか?あなたの経験を共有してください、またはいくつかのヒントをお願いします...私はこれで必死だ... :(
EDIT 1:ちょっと考えてみてください。以下のコードでは、実際にm4aファイルの生データを取得しています。しかし、選手たちはそれを認識しないように
何のヘッダまたは他の構造を有していないJavaの一部:?#include <cerrno>
#include <cstddef>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <math.h>
#include "ipaws.h"
#include "faac.h"
int cppJNIconvPCM2FAAC(
const char *inputPath,
const char *outputPath )
{
unsigned long faacInputSamples;
unsigned long faacMaxOutputBytes;
faacEncHandle faac = faacEncOpen(16000, 1, &faacInputSamples, &faacMaxOutputBytes);
if (!faac) {
return 0;
}
faacEncConfigurationPtr faacConfig = faacEncGetCurrentConfiguration(faac);
faacConfig->mpegVersion = MPEG4;
// faacConfig->aacObjectType = MAIN;
faacConfig->aacObjectType = LOW;
faacConfig->allowMidside = 0;
faacConfig->useLfe = 0;
faacConfig->useTns = 0;
faacConfig->bitRate = 16000; // per channel
// faacConfig->quantqual = 100;
faacConfig->outputFormat = 0; // Raw
faacConfig->inputFormat = FAAC_INPUT_16BIT;
faacConfig->bandWidth = 0;
if (!faacEncSetConfiguration(faac, faacConfig)) {
return -1;
}
FILE* fd = fopen(inputPath, "rb");
if (fd == NULL) {
return -2;
}
FILE* fdout = fopen(outputPath, "wb+");
if (fdout == NULL) {
return -3;
}
char* bufSrc = new char[faacInputSamples*2]; // 每个采样16位PCM,2字节
char* bufDst = new char[faacMaxOutputBytes];
while (1) {
int read = fread(bufSrc, faacInputSamples, 2, fd);
if(read < 1)
break;
int nread = faacEncEncode(faac, (int32_t *)bufSrc, (unsigned int)faacInputSamples, (unsigned char*)bufDst, faacMaxOutputBytes);
fwrite(bufDst, nread, 1, fdout);
}
fclose(fdout);
fclose(fd);
delete[] bufSrc;
delete[] bufDst;
faacEncClose(faac);
return 1;
}