Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2010.10.10;
Скачать: [xml.tar.bz2];

Вниз

При кодировании в 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 вся ветка

Форум: "Media";
Текущий архив: 2010.10.10;
Скачать: [xml.tar.bz2];

Наверх





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


2-1279280809
Jacksotnik
2010-07-16 15:46
2010.10.10
Непонятное что-то с запросом


6-1226223112
diks
2008-11-09 12:31
2010.10.10
Помогите с кодом в CodeGear RAD Studio 2007


6-1226681305
Netter
2008-11-14 19:48
2010.10.10
Скачивание файла


11-1224874964
AnarchyMob
2008-10-24 23:02
2010.10.10
Использование диологовых окон из ресурсов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский