2

ピッチを変えずにmp3ファイルのテンポを変えたい。私はmp3ファイルのバイト配列を持っています。そのテンポを変更し、そのテンポを増減してSDカードに保存したいと考えています。私はそれについてたくさん検索しました、人々はLameライブラリとffmpegについて取っていました。Androidのオーディオmp3ファイルのlib ffmpegまたはlib Lameでテンポを変更することは可能ですか.そうであれば、WindowsでffmpegまたはLameをコンパイルする方法. android.mk とラッパー クラスの記述に助けが必要です。手伝ってくれてありがとう

編集

このLinkの助けを借りて lib lame を正常にコンパイルしました。しかし、これらのネイティブ メソッド (Encoder.java ファイルに記述されている) を使用して mp3 ファイルのテンポを変更する方法はまだわかりません。アンドロイドが初めてなので、問題を解決するには正しい方向に移動する必要があります。Android マーケットで xSpeedPlayer という名前のアプリケーションを見たことがあります。このアプリは mp3 のテンポを変更し、その新しいファイルを sdcard に保存します。これは、私のアプリでも達成したいことです。次に、xSpeedPlayer でこれをどのように達成しているかを調べたところ、mp3Lame と mpg123 ライブラリを使用していることがわかりました。しかし、これらのライブラリを使用してどのようにそれを行ったのかはわかりません。今、私は前進するために助けが必要です。

編集

私は Mp3 ファイルの pcm データを持っており、LAME lib のネイティブ mathos を持っています.. (しかし、これらのメソッドを使用してテンポを変更する方法がわかりません)

/**
 * Initialize LAME.
 * 
 * @param inSamplerate input sample rate in Hz.
 * @param outChannel number of channels in input stream.
 * @param outSamplerate output sample rate in Hz.
 * @param outBitrate brate compression ratio in KHz.
 * @param quality quality=0..9. 0=best (very slow). 9=worst.<br />
 *            recommended:<br />
 *            2 near-best quality, not too slow<br />
 *            5 good quality, fast<br />
 *            7 ok quality, really fast
 * @param id3tagTitle ID3 Tag title.
 * @param id3tagArtist ID3 Tag artist.
 * @param id3tagAlbum ID3 Tag album.
 * @param id3tagYear ID3 Tag year.
 * @param id3tagComment ID3 Tag comment.
 */
public native static int init(int inSamplerate, int outChannel,
        int outSamplerate, int outBitrate, int quality, String id3tagTitle,
        String id3tagArtist, String id3tagAlbum, String id3tagYear,
        String id3tagComment);

/**
 * Encode buffer to mp3.
 * 
 * @param instanceIndex Instance index.
 * @param buffer_l PCM data for left channel.
 * @param buffer_r PCM data for right channel.
 * @param sambles number of samples per channel.
 * @param mp3buf result encoded MP3 stream. You must specified
 *            "7200 + (1.25 * samples)" length array.
 * @return number of bytes output in mp3buf. Can be 0.<br />
 *         -1: mp3buf was too small<br />
 *         -2: malloc() problem<br />
 *         -3: lame_init_params() not called<br />
 *         -4: psycho acoustic problems
 */
public native static int encode(int instanceIndex, short[] buffer_l, short[] buffer_r,
        int samples, byte[] mp3buf);

/**
 * Encode buffer L & R channel data interleaved to mp3.
 * 
 * @param instanceIndex Instance index.
 * @param pcm PCM data for left and right channel, interleaved.
 * @param sambles number of samples per channel. <strong>not</strong> number
 *            of samples in pcm[].
 * @param mp3buf result encoded MP3 stream. You must specified
 *            "7200 + (1.25 * samples)" length array.
 * @return number of bytes output in mp3buf. Can be 0.<br />
 *         -1: mp3buf was too small<br />
 *         -2: malloc() problem<br />
 *         -3: lame_init_params() not called<br />
 *         -4: psycho acoustic problems
 */
public native static int encodeBufferInterleaved(int instanceIndex, short[] pcm, int samples,
        byte[] mp3buf);

/**
 * Flush LAME buffer.
 * 
 * @param instanceIndex Instance index.
 * @param mp3buf result encoded MP3 stream. You must specified at least 7200
 *            bytes.
 * @return number of bytes output to mp3buf. Can be 0.
 */
public native static int flush(int instanceIndex, byte[] mp3buf);

/**
 * Close LAME.
 * 
 * @param instanceIndex Instance index.
 */
public native static void close(int instanceIndex);

}

mp3の生データのテンポを変えてsdcardに保存することはできますか?助けてください...どんな種類の助けにも感謝します

4

1 に答える 1

2

imho、あなたの問題はffmpegに直接関係していませんが、信号処理に関係しています。

実際、私はあなたのニーズを3つの部分に分けます:1-mp3ファイルから生データを抽出する必要があります2-ピッチを変更するためにこれらのデータに信号処理アルゴリズムを適用する必要があります(面白くて難しいタスク)3-あなた新しい計算データをmp3に変換してから、SDCardで同じにする必要があります。

パート1とパート3は、グーグルで解決するのはそれほど難しいことではありません。

パート2については、信号処理の基本についてある程度の知識が必要です。私が試みるのは、データに高速フーリエ変換を適用し、結果をタイムスケールでスケーリングしてテンポを変更し、最後に逆FFTを実行することです。これが、ピッチを変更せずにテンポを変更する唯一の方法(afaik)です。

お役に立てれば...

于 2012-08-27T08:38:03.920 に答える