在android中改变mp3文件的速度

时间:2012-08-18 11:38:50

标签: android android-ndk mp3

我想在不改变音高的情况下改变mp3文件的速度。我有mp3文件的字节数组,想要改变它的速度并用sdcard中增加或减少的速度保存它。我搜索了很多,人们正在关于Lame库和ffmpeg。是否可以使用lib ffmpeg或lib中的音频mp3文件的Lame来改变速度。如果是,那么如何在windows上编译ffmpeg或Lame。在编写android.mk和包装类时需要帮助。帮帮我 感谢

修改

我已经在Link的帮助下成功编译了lib lame。但仍然不知道如何使用这些本机方法(用Encoder.java文件编写)来改变mp3文件的速度。由于我是新手,需要正确的方向,以正确的方向来解决我的问题。我在Android市场上看到了一个名为xSpeedPlayer的应用程序。这个应用程序改变了mp3的速度,并将该新文件保存到SD卡中。这也是我想在我的应用程序中实现的。然后我搜索了他们如何在xSpeedPlayer中实现这一点,并发现他们正在使用mp3Lame和mpg123库。但是不知道他们是如何使用这些库完成它的。现在我需要帮助才能继续前进。

编辑

我有Mp3文件的pcm数据,并且有LAME lib的本机方法,它们是......(但不知道如何使用这些方法来改变速度)

/**
 * 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原始数据的速度并将其存储在SD卡中?帮帮我... Thanx提供任何帮助

1 个答案:

答案 0 :(得分:2)

imho,你的问题与ffmpeg没有直接关系,但与信号处理有关。

事实上,我会将您的需求分为三部分: 1-您需要从mp3文件中提取原始数据 2-你需要对这些数据应用一些信号处理算法来改变音高(有趣和困难的任务) 3-您需要将新的计算数据转换为mp3,然后将它们与SDCard相同。

使用谷歌搜索来解决第1部分和第3部分并不是很困难。

关于第2部分,您需要掌握一些有关信号处理基础知识的知识。我会尝试对您的数据应用快速傅立叶变换,然后在时间尺度上缩放结果以改变您的速度,最后执行逆FFT。 这是改变速度而不改变音高的唯一方式(afaik)。

希望这会有所帮助......