Воспроизведение файлов через libvorbis

Список разделов Ogg Vorbis Тех-поддержка

Описание: Инструменты, кодеки, сопроводительная информация, алгоритмы, программирование.

Сообщение #1 georgmay » 02.05.2009, 13:13

Люди, прошу помочь разобраться.
Может это и глуповато-частый вопрос, но ответа на него я так и не нашёл.
Можно ли каким-нибудь образом воспроизвести ogg файл ТОЛЬКО с помощью libvorbis(+компоненты типа enc,file)?
мне необходимо, чтобы файл ogg(data/music/part12_event4_gmm.ogg) был воспроизведён 1 раз.
georgmay
Откуда: Беларусь, Мінск
Репутация: 0
С нами: 14 лет 10 месяцев

Сообщение #2 Returned » 02.05.2009, 14:42

Аналогичный вопрос уже поднимался. Если мой ответ в той теме вас не удовлетворит, то я к сожалению ни чем не смогу помочь на данный момент. Если владеете английским, то могу порекомендовать только почитать описание API.
Returned
Куратор
Аватара
Откуда: Россия, Москва
Репутация: 1
С нами: 17 лет 10 месяцев

Сообщение #3 georgmay » 02.05.2009, 16:41

Да читал я Рыбный АПИ.
Максимум что у меня получилось - открыть ogg файл и считать его физическое время воспроизведения, битрейт, и т.п. инфу.
Видимо пихает байты в память ворбис, который необходимо воспроизводить средствами DirectX(ну, это от платформы зависит).

Может пример воспроизведения ogg есть у кого-нибудь?
(Во,блин,дожил)
georgmay
Откуда: Беларусь, Мінск
Репутация: 0
С нами: 14 лет 10 месяцев

Сообщение #4 Returned » 02.05.2009, 17:58

Сама библиотека построена на принципе поточности, сплошные структуры и потоки. Принцип мне полностью понятен, всё логично, но совладать с этой libvorbis никак не получается, уж очень она дремучая. С другими библиотеками разобрался с ходу.
Returned
Куратор
Аватара
Откуда: Россия, Москва
Репутация: 1
С нами: 17 лет 10 месяцев

Сообщение #5 georgmay » 02.05.2009, 19:31

мдя, у меня сейчас всё на BASS, но он, зараза, денег стоит.
а нужно то - просто воспроизвести ogg, ну и DSP конечно, иногда...
georgmay
Откуда: Беларусь, Мінск
Репутация: 0
С нами: 14 лет 10 месяцев

Сообщение #6 B3ND3R » 03.05.2009, 01:12

Может пример воспроизведения ogg есть у кого-нибудь?
Есть набор утилит от xiph.org, vorbis-tools, там есть простенький проигрыватель ogg123, ну и другой софт, инфу о файле получать, теги редактировать. Видимо, он должен через libvorbis работать.
B3ND3R
Репутация: 1
С нами: 16 лет 10 месяцев

Сообщение #7 Returned » 03.05.2009, 11:46

Предлагаю немного пофлудить в это теме и выработать решение. Какая последовательность API для открытия ogg файла (если можно, с небольшими комментариями)?
Returned
Куратор
Аватара
Откуда: Россия, Москва
Репутация: 1
С нами: 17 лет 10 месяцев

Сообщение #8 georgmay » 06.05.2009, 23:03

Код: Выделить всё
            int eof=0;
   FILE *in = fopen("data/sound/file.ogg","rb");
   char pcmout[4096];
   int current_section;

   if(ov_open_callbacks(in,&vf,NULL,0,OV_CALLBACKS_NOCLOSE) < 0)
   {
                 throw "Error while opening file."
                 exit(1);
   }


   vorbis_info *vi=ov_info(&vf,-1);
   while(!eof){
      long ret=ov_read(&vf,pcmout,sizeof(pcmout),0,2,1,&current_section);
      if (ret == 0) {
         eof=1;
      } else if (ret < 0) {
         printf("Error in PCM.");
      } else {
         // тут код воспроизведения PCM
       
       }
   }

  ov_clear(&vf);
  return true;

прошу. открытие потока и чтение файла.
georgmay
Откуда: Беларусь, Мінск
Репутация: 0
С нами: 14 лет 10 месяцев

Сообщение #9 Returned » 07.05.2009, 14:21

Ну это понятно, полностью выдрано из исходников, а что такое OV_CALLBACKS_NOCLOSE? Что за структура такая? Можно ваш файл на изучение?

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

P.S.
Кстати утилиты из vorbis-tool вообще не используют libvorbisfile.dll, они напрямую работают с libvorbis и libogg. Функции не документированы.
Returned
Куратор
Аватара
Откуда: Россия, Москва
Репутация: 1
С нами: 17 лет 10 месяцев

Сообщение #10 Returned » 07.05.2009, 16:15

Вопрос ещё актуален или уже разобрались?
Returned
Куратор
Аватара
Откуда: Россия, Москва
Репутация: 1
С нами: 17 лет 10 месяцев

Сообщение #11 georgmay » 07.05.2009, 16:56

актуален.

я не хочу платить деньги платным библиотекам за ипользование 5% их возможностей...

ну дык вот, в коде видно что мы в цикле while получаем PCM который надо воспроизвести, вопрос как?
georgmay
Откуда: Беларусь, Мінск
Репутация: 0
С нами: 14 лет 10 месяцев

Сообщение #12 Returned » 07.05.2009, 19:14

Вот только что удалось воспроизвести 5 секунд через OpenAL. Берём библиотеку отсюда, там же SDK к ней, в SDK подробные примеры, даже есть готовая библиотека воспроизведения Ogg. Удобная он-лайн помощь по API. Вот короткий кусок на ассемблере:
Код: Выделить всё
        ....
        cinvoke alcOpenDevice, 0                           ;получаем хендл первого устройства (используется по умолчанию)
        mov    [MainDevice], eax

        cinvoke alcCreateContext,[MainDevice], 0           ;создаем контекст устройства
        mov    [MainContext], eax
        cinvoke alcMakeContextCurrent,[MainContext]        ;делаем контекст текущим

        cinvoke alGenBuffers, 1, FirstBuffer               ;даем команду создать один буфер
        cinvoke alGenSources, 1, FirstSource               ;создаем один источник

        <-->
        здесь функция декодирования потока, данные пишутся в hStream
        <-->

        cinvoke alBufferData, [FirstBuffer], AL_FORMAT_STEREO16, [hStream], 4096*300, 44100      ;копируем загруженные данные в созданный буфер
        cinvoke alSourcei,[FirstSource], AL_BUFFER, [FirstBuffer]  ; //связываем наш источник с буфером

        cinvoke alSourcePlay, [FirstSource]                                         ;воспроизведение     
        ....

Если что будет не понятно после чтения SDK, постараюсь помочь.

Добавлено спустя 20 часов 8 минут 46 секунд:
В общем всё воспроизводится отлично, но только если декодировать файл целиком в буфер, и оттуда его проигрывать. Правильно же сделать декодирование по небольшим кусочкам, работать сразу с несколькими буферами, как это сделано во всех плеерах. Вот на создании этого цикла я пока застрял, а схема примерно следующая:

1. Создаются два или более буферов
2. В эти буфера по мере воспроизведения подгружаются данные и меняются местами, то есть проиграли один буфер, сразу же подставляем другой, что бы воспроизведение было плавным, без пауз и щелчков
3. Буфера то ли создаются каждый раз заново для новой порции данных, то ли просто сменяют друг друга. Здесь я не разобрался ещё

Нужно так же учитывать, что так-как битрейт переменный, то и размер декодированных данных (кадров) меняется. Поэтому скажем что бы заполнить буфер размером в 4096 байт, нужно произвести несколько чтений ov_read, и тут тоже встает вопрос о синхронизации. Само воспроизведение не представляет сложности, главное правильно организовать цикл с подгрузкой данных и сменой буферов, это и будет основной работой.
Returned
Куратор
Аватара
Откуда: Россия, Москва
Репутация: 1
С нами: 17 лет 10 месяцев

Сообщение #13 georgmay » 08.05.2009, 22:58

всё разобрался с помощью OpenAL, всё работает.

кстати, то над чем вы мучаетесь лежит в папке примерах у OpenAL SDK.
georgmay
Откуда: Беларусь, Мінск
Репутация: 0
С нами: 14 лет 10 месяцев

Сообщение #14 Returned » 09.05.2009, 02:57

Всё получилось, работает, а главное понят принцип работы. Прям хоть плеер теперь свой пиши :lol:
Returned
Куратор
Аватара
Откуда: Россия, Москва
Репутация: 1
С нами: 17 лет 10 месяцев

Сообщение #15 georgmay » 09.05.2009, 14:18

SuperOggPlayer,Returned version...
кстати, это идея! но не простой плеер, а особенный... со специальными фичами, которые доступны только ogg =)
georgmay
Откуда: Беларусь, Мінск
Репутация: 0
С нами: 14 лет 10 месяцев

След.

Вернуться в Тех-поддержка