2012-02-04 13 views
0

私はAndroidアプリケーションの一部にネイティブLAMEコードを使用しています。このコードは、入力ファイル(M4A)を指す文字列と出力ファイル(MP3)の文字列を取ることになっています。そのようなことをするために、私が集めることができるようなコードがいくつか見つかりました。しかし、私がMP3ファイルを再生すると、私が聞くのはすべてZIPです!音。録音の長さにかかわらず、私は同じ音を得る。LAME APIを使用してM4A(MPEG-4オーディオ)をMP3に変換するCまたはC++コード

私はこれがサンプルレートと関係があると考えていたので、標準のものすべてを試してみて、ほとんど同じ結果を得ました(いくつかのジップはあまりジッピーです)。

私が見つけた唯一のCコードはここにありますが、私はC++ソリューションも使用しています。

#include <jni.h> 
#include <string.h> 
#include <stdio.h> 
#include <android/log.h> 
#include "lame.h" 

#define DEBUG_TAG "WBA" 

void Java_net_smartnotes_media_RawAudioRecorder_transcode(JNIEnv * env, jobject this, jstring from, jstring to) { 
    jboolean isCopy; 
    const char * szFrom = (*env)->GetStringUTFChars(env, from, &isCopy); 
    const char * szTo = (*env)->GetStringUTFChars(env, to, &isCopy); 

    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:LC: [%s]", szFrom); 
    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:LC: [%s]", szTo); 

    int read, write; 

    FILE *pcm = fopen(szFrom, "rb"); 
    FILE *mp3 = fopen(szTo, "wb"); 

    const int PCM_SIZE = 8192; 
    const int MP3_SIZE = 8192; 

    short int pcm_buffer[PCM_SIZE*2]; 
    unsigned char mp3_buffer[MP3_SIZE]; 

    lame_t lame = lame_init(); 
    lame_set_in_samplerate(lame, 44100); 
    lame_set_VBR(lame, vbr_default); 
    lame_init_params(lame); 

    do { 
     read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm); 
     if (read == 0) 
      write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE); 
     else 
      write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE); 
     fwrite(mp3_buffer, write, 1, mp3); 
    } while (read != 0); 

    lame_close(lame); 
    fclose(mp3); 
    fclose(pcm); 

    (*env)->ReleaseStringUTFChars(env, from, szFrom); 
    (*env)->ReleaseStringUTFChars(env, to, szTo); 
} 

答えて

3

LAMEに送信する前に、M4Aオーディオを生のオーディオデータにデコードしていません。

「PCMオーディオ」とは圧縮しないことを意味します。

+0

私はそれが設定されている変数からそのように見えることを理解していますが、LAMEにMPEG-4でエンコードされたオーディオファイルを取り込んでMP3に変換する方法があると確信しています。 単に変数名を変更しなかったので、PCMの部分がどのように問題になっているかを理解できます。 –

+1

いいえそのような方法はありません。 LAMEは、MPEG-4でエンコードされたオーディオデータを決して理解できません。 LAMEがあらゆる可能なフォーマット(OGG、FLAC、AACなど)のデコードをサポートすることは期待できません。それ以外は巨大なライブラリになります。 PCMオーディオデータのみを受け入れます。他のライブラリを使用してLAMEに送る前にMPEG-4データをデコードする必要があります。 –

+0

あなたの答え、みんなありがとう。録音方法をAndroidRecordからMediaRecordに変更する必要がありました。 AudioRecordメソッドは、LAMEが最終的にMP3に変換できる生のPCMの出力を可能にします!私が今問題を抱えているのは、サイクロンのように聞こえることですが、それはPCMファイルをまとめる方法と関係していると思います。再度、感謝します! –

関連する問題