2014-09-06 4 views
0

Я работаю сейчас с AudioTrack. Я загружаю mp3-файл и играю в него. Однако, в зависимости от устройств, музыка играет либо половину скорости, либо нормальную скорость.AudioTrack играет с непоследовательной скоростью на разных устройствах

Мой код:

AudioTrack track= new AudioTrack(AudioManager.STREAM_MUSIC, 
    sampleRate, 
    AudioFormat.CHANNEL_CONFIGURATION_MONO, 
    AudioFormat.ENCODING_PCM_16BIT, 
    initBuffer, 
    AudioTrack.MODE_STREAM); 

sampleRate является частота дискретизации возвращение AudioFormat и размер буфера от AudioTrack.getMinBufferSize().

Я попытался изменить частоту дискретизации, но без разницы. Размер буфера также не влияет.

Фактически, переход на CHANNEL_CONFIGURATION_STEREO делает музыку в обычном режиме на устройствах, которые были медленными, но это также делает работу, которая работает нормально, в два раза выше нормальной скорости. Моя проблема в том, что я хочу, чтобы все устройства играли с нормальной скоростью.

Любые предложения?

Я прочитал эту тему: Android AudioTrack slow playback, но это не говорит мне, как узнать, какие устройства должны играть в моно или стерео.

устройства при нормальной скорости: Урбано 4.2.2, Galaxy S4 4.3

Устройства на половине скорости, Galaxy S4 4.2.2, Experia Z 4.2.2

Кстати, я не могу использовать MediaPlayer для воспроизведения , AudioTrack включен в пользовательский плеер, и мне нужно записать аудиоданные, когда я их извлечу. MediaPlayer не будет делать трюк.

Спасибо.

+0

Если вы еще этого не сделали, вы можете воспользоваться подпиской на [andraudio] (http://music.columbia.edu/mailman/listinfo/andraudio) и запросить там. – Jakar

+0

Спасибо! Я тоже проверю – Herve

ответ

0

Я, наконец, решил свою проблему. Не лучшее решение, но оно работает как минимум.

Для тех, кто заинтересован, я читаю размер BufferInfo и основываясь на нем, решайте, на какой скорости воспроизведения я должен играть. В основном, когда воспроизведение медленное, размер в два раза больше, чем при нормальном воспроизведении скорости. Просто догадаться, но MediaCodec может дублировать данные для конфигурации стерео.

1

попробовать это:

track.setPlaybackRate(88200); 
track.play(); 

Он должен играть в нормальной скорости

+0

Извините, я не могу тестировать устройства прямо сейчас, но он, похоже, не работает. Изменение скорости воспроизведения меняет скорость, но не так, как я ее хочу. Моя проблема в том, что разные устройства будут играть с разной скоростью. Есть ли причина, по которой 88200 даст мне правильную скорость на всех устройствах? – Herve

+0

88200 дает гораздо более высокую аппаратную латентность. –

+0

Протестировано на реальных устройствах, и все еще медленно ... – Herve

0

AudioTrack только позволяет PCM аудио данных, вы не можете играть mp3 остроумие AudioTrack напрямую, вы должны конвертировать mp3 в PCM или использовать что-то else (например, MediaPlayer), чем AudioTrack.

+0

Извините, я забыл упомянуть, что я уже конвертирую файл перед его чтением. – Herve

0

Это немного сложнее, но вот что вы можете сделать, используя adb и ALSA.
Android внутренне использует ALSA.

Ваше устройство должно иметь ALSA, попробуйте:

[email protected]:/$ adb shell cat /proc/asound/version 
Advanced Linux Sound Architecture Driver Version 1.0.25. 

Просто взгляните на Reading ALSA Device names.
Каждого устройства (подразделение карты) имеют захват и воспроизведения компонент.

/proc/asound/card0/pcm1p Как и /proc/asound/card0/pcm1p, где карточка 0 устройство 1 pcm1p ваше воспроизведение и pcm1c является захват (для записи).

  1. доступ к устройству с помощью adb:

    [email protected]:/$ adb shell 
    [email protected]:/$: 
    
  2. Идентификация устройства:

    Итак, вы видите /proc/asound/pcm даст вам длинный список.

    [email protected]:/$: cat /proc/asound/pcm          
    00-00: MultiMedia1 (*) : : playback 1 : capture 1 
    00-01: MultiMedia2 (*) : : playback 1 : capture 1 
    00-02: CS-Voice (*) : : playback 1 : capture 1 
    

    Из вышесказанного я считаю 00-00: MultiMedia1 (*), как card0 и device0 для воспроизведения мультимедиа.

  3. Получение параметров воспроизведения:

    Play ваш загруженный mp3-файл с помощью стандартного музыкального проигрывателя приложения.
    Пока играет песня.
    Выполните следующие команды для card0, device0 (р - воспроизведение) и subdevice0

    [email protected]:/$: cat /proc/asound/card0/pcm0p/sub0/hw_params    
    access: RW_INTERLEAVED 
    format: S16_LE 
    subformat: STD 
    channels: 2 
    rate: 44100 (44100/1) 
    period_size: 1920 
    buffer_size: 3840 
    

    Так попробуйте использовать одни и те же значения при вызове AudioTrack track= new AudioTrack(...); выше значение будет видно только, когда устройство находится в открытом (Воспроизведение аудио).

    Если вы выдаете это неправильное устройство (как, скажем, pcm1p), вы увидите следующее:

    [email protected]:/$: cat /proc/asound/card0/pcm1p/sub0/hw_params  
    closed 
    

Примечание:
Шаг 1 не требует телефон, чтобы быть укорененной , How to Setup ADB.

Альтернативы:

  1. Вы пробовали APIs AudioTrack как getChannelConfiguration() или getChannelCount() от here - Просто Просить.
  2. Пробовали ли вы смотреть на свойства файлов MP3, метаданные содержат информацию о параметрах звука.
2

Я испытал это при попытке декодирования монофонического файла с помощью MediaCodec. На некоторых устройствах кодек выводит стереопоток, а моно - на другой.При настройке звуковой дорожки я использовал формат носителя, возвращенный MediaExtractor, который был моно. На устройствах, где кодек будет генерировать стереопоток, звуковая дорожка будет подаваться в два раза больше образцов. Решением является прослушивание события MediaFormatChanged из MediaCodec и настройка MediaFormat AudioTrack.

Смежные вопросы