Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.10.10;
Скачать: CL | DM;

Вниз

При кодировании в MP3 отсутствует звук   Найти похожие ветки 

 
VoVan ©   (2008-03-25 05:16) [0]

Всем привет. Столкнулся с такой проблемкой: при попытке преобразования миди в мп3 отсутствует звук при воспроизведении полученного мп3-файла, причем если сжимать в мп3 вав-файлы со звуком все в порядке. Пользовался bass.dll, bassmidi.dll, lame_inc.dll.


 
VoVan ©   (2008-03-25 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;


 
Сергей М. ©   (2008-03-25 08:41) [2]


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


Потому что полная ахинея этом в алгоритме .
Ты пытаешься кодировать в mp3 не результат синтеза, а сами midi-данные.


 
Efir   (2008-03-25 20:44) [3]


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


Покажите мне строку, где кодируются сами MIDI данные, если это
BASS_ChannelGetData(BassChan, BufMIDI, SizeOfRead);, то вы глубоко не правы.


 
Efir   (2008-03-25 20:55) [4]


> VoVan ©   (25.03.08 05:16)


У тебя точно MIDI файл, самим bass"ом он проигрывается?


 
Сергей М. ©   (2008-03-26 08:27) [5]


> Efir   (25.03.08 20:44) [3]


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


beEncodeChunk


 
Efir   (2008-03-26 21:04) [6]


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


И что в ней не то? BufMIDI - это уже декодированные WAVE данные.
Вообще всё должно нормально работать, если только автор не намудрил где-то в других местах программы.


 
VoVan ©   (2008-03-27 07:38) [7]


> Efir   (26.03.08 21:04) [6]


Посмотрите пожалуйста на вот такую программку
( выложил сюда: http://vovand.narod.ru/proga.rar )
не знаю где там можно было намудрить, но звука нет.


 
Сергей М. ©   (2008-03-27 08:47) [8]


> Efir   (26.03.08 21:04) [6]


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


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

BASS_MIDI_StreamCreateFile

?

В таком случае она должна работать по времени не меньше времени звучания всей midi-"композиции"..


 
Сергей М. ©   (2008-03-27 10:42) [9]

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

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

MIDILeng:=BASS_ChannelGetLength(BassChan);

полная лажа.


 
Efir   (2008-03-27 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 происходит воспроизведение, а нафих оно нам нужно, если происходит непосредственное кодирование.

Прежде чем спорить, может просто проверить.


 
Сергей М. ©   (2008-03-27 22:00) [11]


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


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


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


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


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


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


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


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


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


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


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


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

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

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

Да ниоткуда !

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

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

Так что горбатого ты тут лепишь, любезный)


 
Efir   (2008-03-27 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 - кодирание.


 
Сергей М. ©   (2008-03-27 22:36) [13]


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


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


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


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

Да и само выражение "декодирование в PCM" есть ахинея, особенно когда речь идет об исходных данных в формате mid.


 
Efir   (2008-03-27 22:43) [14]

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


 
Сергей М. ©   (2008-03-27 22:46) [15]


> Efir   (27.03.08 22:32) [12]


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

Вот и все)

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

Вопрос тебе на засыпку - услышу ли я этот вожделенный свисток в результате работы твоего якобы "в принципе работающего" кода, который сгенерирует мне какой-то там якобы ожидаемый wav (или мп3 - монопенисуально в дан.контексте) и который я укажу к воспроизведению любому "в принципе работающему" плейеру ?


 
Сергей М. ©   (2008-03-27 22:47) [16]


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


Оно мне надо, тебе объяснять, если ты уперся рогом ?)


 
Efir   (2008-03-27 22:48) [17]

При получении хендла ф-цией BASS_StreamCreateFile, BASS сам сканирует файл и знает о нём всё.


 
Сергей М. ©   (2008-03-27 22:49) [18]

С тобой все ясно.
разговор закончен.


 
Efir   (2008-03-27 22:57) [19]


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


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

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


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


Это уже сложный вопрос. Откуда я знаю как работает BASS.
Я не гуру в этой области, но вопрос был и я ответил на него в силу своих знаний. Никто не мешает Вам меня поправить или привести свой вариант, в конце концов это форум.


 
Сергей М. ©   (2008-03-27 23:22) [20]


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


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


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


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

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

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

Изволь)

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

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

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

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

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

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

В упомянутом алгоритме реальным временем даже не пахнет, не говоря уже обо всем остальном.


 
Сергей М. ©   (2008-03-28 00:01) [21]

А вот еще пример : в mid-файле содержится SysEx-секвенция, известная лишь одной из моделей множества семейств множества midi-дивайсов.

Вопрос на засыпку - КАК твой "якобы работающий" алгоритм умудрится "конвертировать" не зная что не зная во что ?)


 
Efir   (2008-03-28 00:07) [22]

Скажу честно - незнаю. Для этого нужно знать какие SoundFont использует bass. С другой стороны если такого инструмента нет, то можно найти и загрузить соответствующий SoundFont.

p.s. Если я написал бред, сильно не ругайте )


 
Сергей М. ©   (2008-03-28 00:08) [23]

Так что не надо уже парить мозги ВоВанУ бассами и прочей иже с ней шнягой - челу для начала надо просто понять, что сама постановка вопроса не выдерживает никакой критики)


 
Сергей М. ©   (2008-03-28 00:14) [24]


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


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

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

Превратить же midi-конфетку в кучу wave-дерьма можно и безо всяких бассов.


 
Сергей М. ©   (2008-03-28 00:22) [25]

Ну и на десерт совсем полный ништяк - mid-файл содержит единственный трек с текстовой караоке-секвенцией, а басс его преобразует в мп3, и плейер умудряется на полном серьезе пробухтеть этот мп3)

Жесть !)



Страницы: 1 вся ветка

Текущий архив: 2010.10.10;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.017 c
15-1278656926
И. Павел
2010-07-09 10:28
2010.10.10
Выполнился ли post/get через WebBrowser.Navigate


2-1278936046
Xmen
2010-07-12 16:00
2010.10.10
Как можно присоединить пару документов Word.


15-1278662537
Дмитрий Тимохов
2010-07-09 12:02
2010.10.10
Системы бекапа и синхронизации


15-1278880180
Юрий
2010-07-12 00:29
2010.10.10
С днем рождения ! 12 июля 2010 понедельник


2-1278914568
Irisss
2010-07-12 10:02
2010.10.10
Неправильный запрос