mp3 в wav: как избавиться от щелчков?

Тема в разделе "Сжатие звука", создана пользователем Stariy, 13 ноя 2007.

  1. Stariy

    Stariy Member

    Публикаций:
    0
    Регистрация:
    22 окт 2003
    Сообщения:
    529
    Адрес:
    Russia
    Народ, помогите прояснить ситуацию. Итак, написал прогу для конвертирования mp3 в wav. Прога использует библиотеку fmod.
    Проблема в том, что после конвертирования появляются щелчки и дефекты, примерно раз в 5-10 секунд. От файла не зависит, пробовал несколько. Код:
    Код (Text):
    1.     FILE *f = fopen ("\\recdata.dat", "wb");
    2.     fwrite(&RIFF, sizeof(RIFF), 1, f);
    3.     m_Progress.SetRange(0,sizemp3/(256*1024));
    4.     m_progress_info.SetWindowTextW(_T("Не дышать, идет процесс..."));
    5.     m_progress_info.UpdateWindow();
    6.    
    7.     for(i=0;i<1+sizemp3/(256*1024);i++)
    8.     {
    9.         samp = FSOUND_Sample_Load(FSOUND_FREE,mp3,FSOUND_2D,(256*1024)*i,(256*1024));
    10.         if(!samp)
    11.         {
    12.             break;
    13.         }
    14.         // Получаем доступ к звуковым данным в буфере звукового образца
    15.         // Буфер имеет кольцевую структуру, поэтому задается двумя указателями.
    16.         void *ptr1, *ptr2;
    17.         unsigned int len1, len2;
    18.         FSOUND_Sample_Lock(samp, 0, rec_len, &ptr1, &ptr2, &len1, &len2);
    19.         fwrite(ptr1, len1, 1, f);
    20.         if (len2) fwrite(ptr2, len2, 1, f);
    21.         FSOUND_Sample_Unlock(samp, ptr1, ptr2, len1, len2);
    22.         if (samp) FSOUND_Sample_Free(samp);
    23.         m_Progress.SetPos(i);
    24.         m_Progress.UpdateWindow();
    25.     }
    26. fclose(f);
    Почему в цикле? Потому что если засунуть весь файл одним махом, то памяти не хватает. Ее мало очень, мегов 30 свободно, а результат получается 50 с хвостиком, потому и сделал цикл.
    пробовал скармливать функции FSOUND_Sample_Load файл целиком, но меньшего размера, секунд на 30 - вроде бы щелчков не заметил, и памяти хватило. Так что есть подозрение, что все дело в цикле, вернее, в неверной его организации. Может быть, надо считывать кусочки не тупо одинакового размера, а по границам фреймов?
     
  2. MagnumGT

    MagnumGT New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    122
    Проблема в том, что твой код одну аудиодорожку разбивает на несколько.

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

    По поводу памяти? ЧТо значит мегов 30? Почему нельзя сделать кэшфайл на диске? И обрабатывать единый поток.
     
  3. Stariy

    Stariy Member

    Публикаций:
    0
    Регистрация:
    22 окт 2003
    Сообщения:
    529
    Адрес:
    Russia
    Ой, виноват, не сказал - прога для pocketpc, отсюда и жесткие ограничения по памяти, там ее всего 64 мб, и половина забита всякой дрянью. Чтение и запись файла происходят с SD-карты. Если отдать этой функции весь файл сразу, то она говорит -not engouth memory, отсюда и пошла возня с циклом. Я пробовал портировать lame и др. - конвертит нормально, но ОЧЕНЬ медленно, 20-30 минут. Для оптимизации под арм не хватает мозга, потому и взял готовую либу.
     
  4. Stariy

    Stariy Member

    Публикаций:
    0
    Регистрация:
    22 окт 2003
    Сообщения:
    529
    Адрес:
    Russia
    Fmod же работает 1-2 минуты. Интересно, что за заголовки такие, вроде бы на выходе получаются raw-данные, заголовок wav я потом самостоятельно формирую и приляпываю в начало файла. Попробую писать каждый кусок в отдельный файл и проанализировать. Я так понимаю, что мое предположение насчет границ фреймов неверно?