Воспроизведение звука с неправильной скоростью с использованием FFmpeg на Android

Общая проблема в следующем: я декодирую звук следующим образом:

ReSampleContext* rsc = av_audio_resample_init(
        1, aCodecCtx->channels,
        aCodecCtx->sample_rate, aCodecCtx->sample_rate,
        av_get_sample_fmt("u8"), aCodecCtx->sample_fmt,
        16, 10, 0, 1);

while (av_read_frame(pFormatCtx, &packet)>= 0) {
    if (aCodecCtx->codec_type == AVMEDIA_TYPE_AUDIO) {
        int data_size = AVCODEC_MAX_AUDIO_FRAME_SIZE * 2;
        int size=packet.size;
        int decoded = 0;

         while(size > 0) {
             int len = avcodec_decode_audio3(aCodecCtx, pAudioBuffer, 
                 &data_size, &packet);

             //Сonvert audio to sample 8bit
             out_size = audio_resample(rsc, outBuffer, pAudioBuffer, len);

             jbyte *bytes = (*env)->GetByteArrayElements(env, array, NULL);

             memcpy(bytes, outBuffer, out_size);
             (*env)->ReleaseByteArrayElements(env, array, bytes, 0);
             (*env)->CallStaticVoidMethod(env, cls, mid, array, out_size, number);

             size -= len;
             number++;
         }
     }
 }

Далее выпустите его AudioTrack. После этого я слышу ту песню, которая была нужна, но с шумом и скоростью в 2 раза большей. В чем может быть проблема?

ОБНОВЛЕНИЕ: это код Java:

public static AudioTrack track;
public static byte[] bytes;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    int bufSize = 2048;
    track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_MONO, 
                AudioFormat.ENCODING_PCM_8BIT, bufSize, AudioTrack.MODE_STREAM); 

    bytes = new byte[bufSize];
    Thread mAudioThread = new Thread(new Runnable() {
        public void run() {
            int res = main(2, "/sdcard/muzika_iz_reklami_bmw_5_series_-_bmw_5_series.mp3", bytes);
            System.out.println(res);
        } 
    });
    mAudioThread.setPriority(Thread.MAX_PRIORITY);
    mAudioThread.start(); 
}

private static void play(byte[] play, int length, int p) {
    if (p==0){
        track.play();
    }
    track.write(play, 0, length); 
}

person Kyborg2011    schedule 31.03.2011    source источник
comment
принять ответы на ваши предыдущие вопросы; вы задали 8 вопросов, но приняли только 1; это в твоем профиле   -  person fazo    schedule 31.03.2011


Ответы (2)


Это может быть проблемой несоответствия частоты дискретизации. Возможно, вы создаете audioTrack с меньшей частотой дискретизации по сравнению с фактической частотой.

Это также может быть проблема с конфигурацией канала AudioTrack, как упоминал Мэттью.

Может быть, вам следует попробовать что-то вроде того, что я ответил в этом вопрос.

Потому что то, как вы взаимодействуете с JNI из Java, я не уверен, будет ли это работать. У меня мало знаний о JNI. Но мой код работает со мной, и это то, что я сейчас использую в своем приложении.

person Anil Arrabole    schedule 31.03.2011
comment
Прошу в С частота дискретизации 44100 и Аудиотрек поставить такой же. Может есть другие проблемы? - person Kyborg2011; 31.03.2011
comment
Частота дискретизации звука в файле такая же, как 44100? FFmpeg даст вам частоту дискретизации воспроизводимого файла. Используйте то же самое. С другой стороны, есть инструмент под названием mediainfo, который предоставит вам кодек и другие сведения о файле. Посмотрите, правильно ли это. - person Anil Arrabole; 31.03.2011
comment
aCodecCtx-> sample_rate возвращает мне 44 100! Как может быть неправильная частота дискретизации? - person Kyborg2011; 01.04.2011
comment
Это может быть проблема с передачей буфера? Сегодня выложу код AudioTrack. Посмотри - person Kyborg2011; 01.04.2011
comment
Ответ обновлен. Возможно, вам следует попробовать другой подход для взаимодействия с JNI. Я не уверен, что пошло не так с вашим кодом. - person Anil Arrabole; 01.04.2011

Возможно, ваш AudioTrack ожидает стереоданные, но вы отправляете их в моно. Вы можете попробовать настроить конфигурацию канала AudioTrack на CHANNEL_OUT_MONO.

person Matthew Willis    schedule 31.03.2011
comment
Я использую CHANELL_OUT_MONO, но это не помогает - person Kyborg2011; 01.04.2011