Неправильная продолжительность звукового файла на Android 2.2 - PullRequest
0 голосов
/ 20 мая 2011

Я занимаюсь разработкой приложения, в котором есть список некоторых аудиофайлов. Когда я нажимаю на элемент, он воспроизводит соответствующий звук, а также показывает продолжительность. Проблема в устройстве и эмуляторе Android 2.1: правильная длительность, но в эмуляторе Android 2.2 неверная длительность. У кого-нибудь есть идея решить проблему. Есть ли хороший способ получить правильную продолжительность звуковых файлов. Аудио файлы находятся в папке res / raw. И одна вещь для тех же звуков iphone показывает правильную продолжительность.

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

Да

Возможно, это из-за файлов VBR.Переменные скорости передачи битов упоминают скорость в заголовке, которая, вероятно, используется программным обеспечением Android для расчета продолжительности MP3 по его длине.

Я помню, как видел утилиту, которая может рассчитать «правильный» эффективный битрейт идобавьте в начале отдельный фрейм данных MP3, чтобы он сообщал о «правильном» (среднем) битрейте.

Попробуйте VBRFix

На протяжении всей песниявляются точками, которые требуют высокого качества, и точками, которые требуют низкого качества (то есть тишина).Вместо того, чтобы иметь весь файл с одним качеством: VBR (переменная скорость передачи данных) обеспечивает нам переменное качество в файле.Это позволяет нам более эффективно использовать файловое пространство.Проблема заключается в том, что многие программы воспроизведения MP3 оценивают время воспроизведения MP3 на основе первого найденного битрейта и размера файла.Кроме того, при переходе по файлу позиции не совпадают - половина песни в формате VBR может не совпадать с серединой песни.Ogg Vorbis - это более продвинутый бесплатный музыкальный формат, который по умолчанию без проблем использует VBR

Он также есть в репозиториях для Ubuntu (вероятно, для Debian): sudo apt-get install vbrfix

0 голосов
/ 05 августа 2013

Возможно, я немного опоздал с ответом, но, в любом случае, мне удалось решить проблему подобного рода, используя Ringdroid .Это то, что вам нужно сделать, чтобы получить длительность звука в миллисекундах из файлов VBR с помощью Rindroid

public class AudioUtils
{
    public static long getDuration(CheapSoundFile cheapSoundFile)
    {
        if( cheapSoundFile == null)
            return -1;
        int sampleRate = cheapSoundFile.getSampleRate();
        int samplesPerFrame = cheapSoundFile.getSamplesPerFrame();
        int frames = cheapSoundFile.getNumFrames();
        cheapSoundFile = null;
        return 1000 * ( frames * samplesPerFrame) / sampleRate;
    }

    public static long getDuration(String mediaPath)
    {
        if( mediaPath != null && mediaPath.length() > 0)
            try 
            {
                return getDuration(CheapSoundFile.create(mediaPath, null));
            }catch (FileNotFoundException e){} 
            catch (IOException e){}
        return -1;
    }
}

Надеюсь, это поможет

...