2011-12-03 12 views
2

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; 
} 

答えて

0

jint Java_com_phonegap_plugins_cjplugs_CJPlugs_JNIconvPCM2FAAC(
    JNIEnv* env, 
    jobject thiz, 
    jstring inputPath, 
    jstring outputPath ) 
{ 
    const char *inFile = (*env)->GetStringUTFChars(env, inputPath, NULL); 
    const char *outFile = (*env)->GetStringUTFChars(env, outputPath, NULL); 

    return cppJNIconvPCM2FAAC(inFile, outFile); 
} 

C++での実際のJNIの一部は、別のラッパーファイルで架橋しました

あなたのプログラムは間違ったことはありません。しかし、アウトプットファイルはヘッドレスなので、アウトプットフォーマットはRAWです。出力ファイルを設定する必要があります。 faacConfig-> outputFormat = 1; そして、FAAD2を使ってファイルをデコードすることができます!

関連する問題