Конференция "Media" » При кодировании в MP3 отсутствует звук
 
  • VoVan © (25.03.08 05:16) [0]
    Всем привет. Столкнулся с такой проблемкой: при попытке преобразования миди в мп3 отсутствует звук при воспроизведении полученного мп3-файла, причем если сжимать в мп3 вав-файлы со звуком все в порядке. Пользовался bass.dll, bassmidi.dll, lame_inc.dll.
  • VoVan © (25.03.08 05:19) [1]
    Вот кусок кода:


    function EncodeToMP3(InFile:string; OutFile:string):boolean;
    var
    NumSamples:DWORD;
    InBufSize: DWORD;
    OutBufSize:DWORD;
    BufMIDI:PSHORT;
    BufMP3: PBYTE;
    BassChan:HSTREAM;
    beStream:THBESTREAM;
    beConfig:TBECONFIG;
    fWrite:TFileStream;
    SizeOfRead:DWORD;
    Encoded: DWORD;
    ErrRes:TBeErr;
    i, MIDILeng:DWORD;  s: string;
    begin
    Result:=false;

    BassChan:=BASS_MIDI_StreamCreateFile(false, PChar(InFile), 0, 0, BASS_STREAM_DECODE, 44100);
    if BassChan=0 then begin
     BASS_StreamFree(BassChan);
     Exit;
    end;

    FillChar(beConfig, SizeOf(beConfig), 0);
    beConfig.Format.dwConfig:=BE_CONFIG_LAME;
    beConfig.Format.LHV1.dwStructVersion:=1;
    beConfig.Format.LHV1.dwStructSize:=SizeOf(beConfig);
    beConfig.Format.LHV1.dwSampleRate:=44100;
    beConfig.Format.LHV1.dwReSampleRate:=0;
    beConfig.Format.LHV1.nMode:=BE_MP3_MODE_STEREO;
    beConfig.Format.LHV1.dwBitrate:=192;
    beConfig.Format.LHV1.dwMaxBitrate:=320;
    beConfig.Format.LHV1.nQuality:=2;
    beConfig.Format.LHV1.dwMpegVersion:=MPEG1;

    MIDILeng:=BASS_ChannelGetLength(BassChan);
    ErrRes:=beInitStream(beConfig, NumSamples, OutBufSize, beStream);
    if ErrRes<>BE_ERR_SUCCESSFUL then begin
     beCloseStream(beStream);
     BASS_StreamFree(BassChan);
     Exit;
    end;

    InBufSize:=NumSamples*4;
     s:=ExtractFileName(InFile);
    OutFile:=OutFile+Copy(s, 1, Length(s)-Length(ExtractFileExt(s)))+'.mp3';
    fWrite:=TFileStream.Create(OutFile, fmCreate);
    try
     BufMIDI:=AllocMem(InBufSize);
     BufMP3:=AllocMem(OutBufSize);
     try
       i:=0;
       while i<>MIDILeng do begin
         if i+InBufSize<MIDILeng then SizeOfRead:=InBufSize
           else SizeOfRead:=MIDILeng-i;

         BASS_ChannelGetData(BassChan, BufMIDI, SizeOfRead);
         ErrRes:=beEncodeChunk(beStream, SizeOfRead div 2, BufMIDI, BufMP3, Encoded);
         if ErrRes<>BE_ERR_SUCCESSFUL then Exit;

         fWrite.WriteBuffer(BufMP3^, Encoded);
         i:=i+SizeOfRead;
       end;

       ErrRes:=beDeinitStream(beStream, BufMP3, Encoded);
       if ErrRes<>BE_ERR_SUCCESSFUL then Exit;

       fWrite.WriteBuffer(BufMP3^, Encoded);
     finally
       fWrite.Free;
       BASS_StreamFree(BassChan);
       beCloseStream(beStream);
     end;
    finally
     FreeMem(BufMIDI);
     FreeMem(BufMP3);
    end;
    Result:=true;
    end;

  • Сергей М. © (25.03.08 08:41) [2]

    > При кодировании в MP3 отсутствует звук


    Потому что полная ахинея этом в алгоритме .
    Ты пытаешься кодировать в mp3 не результат синтеза, а сами midi-данные.
  • Efir (25.03.08 20:44) [3]

    > Сергей М. ©   (25.03.08 08:41) [2]


    Покажите мне строку, где кодируются сами MIDI данные, если это
    BASS_ChannelGetData(BassChan, BufMIDI, SizeOfRead);, то вы глубоко не правы.
  • Efir (25.03.08 20:55) [4]

    > VoVan ©   (25.03.08 05:16)


    У тебя точно MIDI файл, самим bass'ом он проигрывается?
  • Сергей М. © (26.03.08 08:27) [5]

    > Efir   (25.03.08 20:44) [3]


    > Покажите мне строку, где кодируются сами MIDI данные


    beEncodeChunk
  • Efir (26.03.08 21:04) [6]

    > Сергей М. ©   (26.03.08 08:27) [5]


    И что в ней не то? BufMIDI - это уже декодированные WAVE данные.
    Вообще всё должно нормально работать, если только автор не намудрил где-то в других местах программы.
  • VoVan © (27.03.08 07:38) [7]

    > Efir   (26.03.08 21:04) [6]


    Посмотрите пожалуйста на вот такую программку
    ( выложил сюда: http://vovand.narod.ru/proga.rar )
    не знаю где там можно было намудрить, но звука нет.
  • Сергей М. © (27.03.08 08:47) [8]

    > Efir   (26.03.08 21:04) [6]


    > это уже декодированные WAVE данные


    Т.е. ты хочегь сказать, что синтез происходит при вызове ф-ции

    BASS_MIDI_StreamCreateFile

    ?

    В таком случае она должна работать по времени не меньше времени звучания всей midi-"композиции"..
  • Сергей М. © (27.03.08 10:42) [9]
    Рендеринг (тот самый синтез) должен происходить при вызове BASS_ChannelPlay, а им здесь и не пахнет, как не пахнет и захватом стрима-результата рендеринга.

    В то же время в строке

    MIDILeng:=BASS_ChannelGetLength(BassChan);

    полная лажа.
  • Efir (27.03.08 21:21) [10]

    > VoVan ©   (27.03.08 07:38) [7]


    У меня нормально работает. Midi файлы я использовал те, которые в самой Windows XP есть.


    > Сергей М. ©   (27.03.08 08:47) [8]


    BASS_MIDI_StreamCreateFile - создание потока.
    BASS_ChannelGetLength - размер данных (байт), но уже в виде PCM.
    BASS_ChannelGetData - непосредственно декодирование в PCM.
    beEncodeChunk - кодирование в mp3.


    > Рендеринг (тот самый синтез) должен происходить при вызове
    > BASS_ChannelPlay, а им здесь и не пахнет, как не пахнет
    > и захватом стрима-результата рендеринга.


    При вызове BASS_ChannelPlay происходит воспроизведение, а нафих оно нам нужно, если происходит непосредственное кодирование.

    Прежде чем спорить, может просто проверить.
  • Сергей М. © (27.03.08 22:00) [11]

    > BASS_MIDI_StreamCreateFile - создание потока


    Потока каких данных ? PCM ? MID ?


    > BASS_ChannelGetLength - размер данных (байт), но уже в виде
    > PCM


    Они с какой луны свалятся ? Какой конкретно синтезатор сделал это чудесное превращение ? Как он умудрился сделать это мгновенно ?


    > BASS_ChannelGetData - непосредственно декодирование в PCM


    Откуда тогда взялся "размер данных (байт), но уже в виде
    PCM", если "декодирование в PCM" начнется только сейчас ?


    > beEncodeChunk - кодирование в mp3.


    Да хрен бы с ним, с мп3)
    тут дури и безо всяких мп3 по самое нехочу)


    > При вызове BASS_ChannelPlay происходит воспроизведение,


    Воспроизведение и есть процесс вывода на некий дивайс результатов синтеза.


    > а нафих оно нам нужно, если происходит непосредственное
    > кодирование


    Какое такое "непосредственное" ?

    У меня, к примеру, sf-совместимый чипсет, и я хочу получить результирующий поток, сгенерированный ЭТИМ чипсетом на основании КОНКРЕТНОГО саундфонта с КОНКРЕТНЫМИ его параметрами.

    ОТКУДА ф-ции басса знают о том, какой саундфонт я выбрал и какие параметры синтеза мне нужны ?

    Да ниоткуда !

    Ни с какой луны он и в басс не свалятся  !

    Басс будет толкать миди-поток в указанный мной синтез-дивайс (или дифолтный миди-дивайс - не знаю, да и по барабану оно), который сможет выполнить интересующий меня рендеринг не иначе как в РЕАЛЬНОМ РЕЖИМЕ ВРЕМЕНИ !

    Так что горбатого ты тут лепишь, любезный)
  • Efir (27.03.08 22:32) [12]

    > Сергей М. ©   (27.03.08 22:00) [11]


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

    Ладно с самого начала.

    BASS_Init(-1, 44100, 0, Handle, nil); инициализация BASS'a

    hStream:=BASS_StreamCreateFile(false, PChar(InFile), 0, 0, BASS_STREAM_DECODE); - получаем хэндл потока с флагом BASS_STREAM_DECODE, то есть воспроизводить мы ничего не собираемся.

    BASS_ChannelGetLength(BassChan); - длина потока в байтах. Так уж получилось но BASS выдаёт длину WAVE DATA, и не ко мне вопрос почему так, а к un4seen.

    BASS_ChannelGetData(BassChan, BufMIDI, SizeOfRead); - эта функция заполняет BufMIDI или значением FFT или WAVE DATA (в зависимости от третьего флага). Если Вы и мне не верите, то посмотрите примеры, посталяемые с библиотекой (например SampleVis).

    beEncodeChunk - кодирание.
  • Сергей М. © (27.03.08 22:36) [13]

    > непосредственно декодирование в PCM


    А это вообще ахинея, если


    > BASS_ChannelGetLength - размер данных (байт), но уже в виде
    > PCM.


    С какой луны свалился "размер", если "декодирование" еще и не начиналось ?

    Да и само выражение "декодирование в PCM" есть ахинея, особенно когда речь идет об исходных данных в формате mid.
  • Efir (27.03.08 22:43) [14]
    Тогда объясните мне почему алгоритм работает???
  • Сергей М. © (27.03.08 22:46) [15]

    > Efir   (27.03.08 22:32) [12]


    Я тебе пытаюсь объяснить, что не следует тупо тыкать якобы работающими (что-то там якобы делающими, но непонятно что) примерами, демонстрируя при этом полнейшее дилетантство в теории и механизме происходящего при этом.

    Вот и все)

    Еще раз тебе говорю - я хочу, чтобы n-й трек некоей midi-композиции, хранящейся в mid-файле, в результирующем файле звучал так как я хочу, например, милицейским свистком, даже если пач там ссылается на Grand Piano в соответствии с GM.

    Вопрос тебе на засыпку - услышу ли я этот вожделенный свисток в результате работы твоего якобы "в принципе работающего" кода, который сгенерирует мне какой-то там якобы ожидаемый wav (или мп3 - монопенисуально в дан.контексте) и который я укажу к воспроизведению любому "в принципе работающему" плейеру ?
  • Сергей М. © (27.03.08 22:47) [16]

    > объясните мне почему алгоритм работает?


    Оно мне надо, тебе объяснять, если ты уперся рогом ?)
  • Efir (27.03.08 22:48) [17]
    При получении хендла ф-цией BASS_StreamCreateFile, BASS сам сканирует файл и знает о нём всё.
  • Сергей М. © (27.03.08 22:49) [18]
    С тобой все ясно.
    разговор закончен.
  • Efir (27.03.08 22:57) [19]

    > Сергей М. ©   (27.03.08 22:46) [15]


    Согласен, в теории и механизме я разбираюсь хреново.

    Вопрос автора стоял в перекодировании MID файла в mp3. Алгоритм я ему привёл, который у меня работает корректно.


    > Еще раз тебе говорю - я хочу, чтобы n-й трек некоей midi-
    > композиции, хранящейся в mid-файле, в результирующем файле
    > звучал так как я хочу, например, милицейским свистком, даже
    > если пач там ссылается на Grand Piano в соответствии с GM.
    >
    >
    > Вопрос тебе на засыпку - услышу ли я этот вожделенный свисток
    > в результате работы твоего якобы "в принципе работающего"
    > кода, который сгенерирует мне какой-то там якобы ожидаемый
    > wav (или мп3 - монопенисуально в дан.контексте) и который
    > я укажу к воспроизведению любому "в принципе работающему"
    > плейеру ?


    Это уже сложный вопрос. Откуда я знаю как работает BASS.
    Я не гуру в этой области, но вопрос был и я ответил на него в силу своих знаний. Никто не мешает Вам меня поправить или привести свой вариант, в конце концов это форум.
  • Сергей М. © (27.03.08 23:22) [20]

    > Вопрос автора стоял в перекодировании MID файла в mp3


    Сама постановка вопроса есть ахинея.
    Потому и ответ на него в любом случае  - такая же ахинея.


    > Алгоритм я ему привёл, который у меня работает корректно


    Что, твой алгоритм позволяет инструменту с GM-кодом, соответствующим grand piano, зазвучать в wav-ипостаси милицейским свистком ? Да еще и мгновенно ?

    Да по тебе шнобелевская премия плачет !

    Желаешь знать истину ?

    Изволь)

    Речь не пойдет ни о каком бассе и иже с ним поделках для формошлепов.

    Речь пойдет об обязательных этапах достижения результата.

    На огурцах он выглядит так:

    1. Поток midi-данных поступает на вход указанного синтезирующего midi-устройства в реальном времени.

    2. midi-устройство, сконфигурированное в соответствии с конкретными требованиями пользователя, в реальном времени генерирует (т.е. осуществляет синтез, или, если угодно, выполняет рендеринг) результирующий поток в формате, например, PCM.

    3. Этот поток в реальном времени м.б. захвачен средствами mixer-устройства и waveIn-устройства и сохранен в виде файла.

    В упомянутом алгоритме реальным временем даже не пахнет, не говоря уже обо всем остальном.
  • Сергей М. © (28.03.08 00:01) [21]
    А вот еще пример : в mid-файле содержится SysEx-секвенция, известная лишь одной из моделей множества семейств множества midi-дивайсов.

    Вопрос на засыпку - КАК твой "якобы работающий" алгоритм умудрится "конвертировать" не зная что не зная во что ?)
  • Efir (28.03.08 00:07) [22]
    Скажу честно - незнаю. Для этого нужно знать какие SoundFont использует bass. С другой стороны если такого инструмента нет, то можно найти и загрузить соответствующий SoundFont.

    p.s. Если я написал бред, сильно не ругайте )
  • Сергей М. © (28.03.08 00:08) [23]
    Так что не надо уже парить мозги ВоВанУ бассами и прочей иже с ней шнягой - челу для начала надо просто понять, что сама постановка вопроса не выдерживает никакой критики)
  • Сергей М. © (28.03.08 00:14) [24]

    > нужно знать какие SoundFont использует bass


    Да нихрена он никакие не использует - он не знает ни о каких SF вообще)

    Чуть более сотни дерьмово семплированных "стандартных" GM-"балалаек" - вот печальный удел басса и печальный результат этого алгоритма)

    Превратить же midi-конфетку в кучу wave-дерьма можно и безо всяких бассов.
  • Сергей М. © (28.03.08 00:22) [25]
    Ну и на десерт совсем полный ништяк - mid-файл содержит единственный трек с текстовой караоке-секвенцией, а басс его преобразует в мп3, и плейер умудряется на полном серьезе пробухтеть этот мп3)

    Жесть !)
 
Конференция "Media" » При кодировании в MP3 отсутствует звук
Есть новые Нет новых   [134431   +14][b:0][p:0.002]