
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.58.11.68] |
![]() |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Да, нашёл какую-то прогу, переконвертировал ею mp3 в ogg, comments получились в UTF-8. Ща буду какой-то конвертер UTF-8 -> Win-1251 сочинять/искать готовый. Знакогенератор в плеере понимает только Win-1251. Стандартные виндозные функции мне не подходят, даже если они и существуют. |
Сообщ.
#17
,
|
|
|
Вариант для OGG с конвертированием инф. тегов из UTF-8 в Win-1251.
Конвертер свой, встроенный, без каких-либо виндозных функций. Прикреплённый файл ![]() |
Сообщ.
#18
,
|
|
|
Если я правильно понял спецификацию ogg, то comments должны быть в UTF-8.
|
Сообщ.
#19
,
|
|
|
Да, всё верно, там UTF-8.
То тот онлайн-перекодировщик наглючил, выдал комментарии в полубредовой полу-DOS кодировке. |
Сообщ.
#20
,
|
|
|
MIDI.
Определяет длительность звучания и битрейт. Понятие "битрейт" для MIDI я, честно говоря, не понимаю, по-моему просто прикол. Определяется делением длины файла на длительность в секундах ![]() В проге возможен глюк на многодорожечных MIDI-файлах. Я не смог это протестировать, т.к. не нашёл таких файлов. Если у кого есть, проверьте пожалуйста, или киньте мне сюда такой файл. И ещё. Проверял на файлах нулевого формата, т.к. используемая в плеере микросхема VS1053 понимает только его. Прикреплённый файл ![]() |
Сообщ.
#21
,
|
|
|
Да, на многодорожечных моё изделие глючит. Ну и фиг с ним
![]() VS1053 их тоже не понимает, потому не смертельно. |
Сообщ.
#22
,
|
|
|
Последний формат - FLAC.
Для себя пока считаю тему закрытой. Всем участвующим спасибо. Но если кто-то улучшит предложенные программки, просьба поделиться ![]() Тут выше интересовались проектом целиком - если кто знает, куда здесь класть подобные вещи, напишите плиз. Когда я всё закончу - выложу. Когда - не знаю, тут ещё кое-что осталось доделать по функционалу... Прикреплённый файл ![]() |
Сообщ.
#23
,
|
|
|
Пришлось снова вернуться к этой теме.
Использовавшийся у меня код для чтения MP3 безбожно врал - правильно читались только ID3v1/v2 тэги, всё остальное в 98% случаях оказывалось полной чушью. Пришлось заняться им вплотную. Нашёл на просторах приемлемый образчик проги на VB.NET, перевёл на чистый Си, доработал её с учётом статьи. Оригинал на VB.NET не выкладываю, т.к. он имеет существенные недоработки: 1. Не учитывает версию MPEG и Layer при определении битрейта и частоты, из-за чего частенько выдаёт неверный результат 2. ID3v2 тег в начале не пропускался (его наличие/отсутствие никак не проверялось), поэтому он иногда думал, что фрейм начинается где-то на середине имени исполнителя или названия песни со всеми вытекающими ... К тому же автор забыл приложить один из файлов формы окна программы - в итоге полная некомпилируемость проекта. Восстанавливать его руками мне стало лениво ![]() Хорошо хоть .exe и основной файл со всеми расчётами дал... Ну а про конвертирование байтов в строки вида 1110101001 и вырезанием из неё нужных битов функцией substring вместо лог AND и сдвигов я вообще молчу - эт вообще ещё тот шедевр ![]() ![]() Если кто-то захочет - выложу. ****************************************************** Следующее замечание касается wav-файлов. Казалось бы, что может быть проще - формат простой, как 3 копейки, разжёван на каждом углу, статей о нём - тьма-тьмущая, даются даже готовые исходники по чтению всех параметров, включая расчёт длительности звучания - http://audiocoding.ru/article/2008/05/22/w...-structure.html Но не тут-то было. При детальном рассмотрении выяснилось, что: 1. Все (те, которые попались мне на глаза) имеющиеся статьи описывают исключительно подформат PCM. 2. Другие подформаты (коих насчитывается больше сотни - http://audiocoding.ru/assets/meta/2008-05-...wav_formats.txt) вообще не рассматриваются. Иногда делается замечание, что они есть и всё ![]() 3. В заголовке файла кроме "стандартных" секций fmt и data никто не запрещает иметь там кучу других, например, аналоги MP3 ID3 тегов оформляются как доп. секции в заголовке WAV файла. Даже в PCM. Это вообще большой-большой секрет и строжайшая "военная тайна", о которой никто и не заикается ![]() В итоге авторы статей делают существенное упрощение - они считают, что всегда имеют дело только с PCM (хоть реально это никак не проверяют), структура заголовка строго фиксирована и в ней есть только 3 подряд идущие части: 1. Первый подзаголовок RIFF длиной 12 байт 2. секция fmt (24 байта - 8 байт заголовок секции + 16-байтовая структура WAVEFORMATEX - см. ниже) 3. первые 8 байт секции data (сигнатура и длина). Они просто вычитывают эти 12+24+8=44 байта в единую структуру и выполняют необходимые расчёты. Исходя из вышесказанного, здесь есть 2, я бы сказал даже 3 грубейшие ошибки: а) Длина секции fmt не 16 байт WAVEFORMATEX (без 8-байтового заголовка секции), её реальная длина хранится в поле subchunk1Size (название из статьи на audiocoding.ru). Её реальное содержимое - не всегда WAVEFORMATEX, а совершенно разные структуры, всегда начинающиеся с WAVEFORMATEX, остальное зависит от её поля wFormatTag. Если там 0 - т.е. это PCM, то в секции больше ничего нет. Т.е. длина секции - 16 байт WAVEFORMATEX. Если, например, там 0055h (подформат MP3), то длина секции 30 байт (структура MPEGLAYER3WAVEFORMAT) б) Не учитывается (никак не проверяется) возможное наличие других секций. У меня, например, есть очень много wav файлов, которые на самом деле mp3 и в которых между fmt и data есть некая секция fact с длиной данных 4 байта. Для чего она нужна я не знаю, но при чтении файла её необходимо правильно "переступать", чтобы корректно выйти на секцию data, длина которой необходима для расчёта длительности звучания файла. в) Алгоритм расчета длительности звучания в вышеупомянутом примере некорректен, он опять же пригоден только для WAV PCM без "лишних" секций в заголовке. Его ошибки анализировать не буду, т.к. из вышесказанного и так всё ясно. Поэтому, если, например, скормить примеру из http://audiocoding.ru/article/2008/05/22/w...-structure.html wav/mp3 файл, то мы получим заведемо неверную информацию. "Ну и несколько слов о погоде" © Cтруктура WAVEFORMATEX в файлах WAV имеет вид: ![]() ![]() typedef struct { WORD wFormatTag; 2 WORD nChannels; 2 DWORD nSamplesPerSec; 4 DWORD nAvgBytesPerSec; 4 WORD nBlockAlign; 2 WORD wBitsPerSample; 2 } WAVEFORMATEX; Т.е. 16 байт., а не 18, как в описании на сайте Microsoft, где в ней есть ещё одно 2-байтовое поле cbSize, но в файле оно отсутствует. Прикладываю 2 простенькие программки на голом Си для определения параметров wav и mp3 файлов. ID3v2 тег для MP3 не дешифруется, просто пропускается, как описано выше. Прикреплённый файл ![]() Прикреплённый файл ![]() |
Сообщ.
#24
,
|
|
|
Новая версия MP3reader.
В предыдущей был найден ряд ошибок: 1. Ошибка с указателем. На некоторых файлах его иногда выносило в космос. Прога в лучшем случае выдавала неправильную инфу, в худшем её прибивала винда молотком по голове. Ну оно и понятно. 2. В некоторых MP3 файлах бывает по 2 ID3v2 тега (а может и больше ![]() 3. Не ошибка, но всё же - немного оптимизировал алгоритм. Из недостатков пока могу отметить только одно - моё изделие иногда врёт ![]() Попадаются какие-то "ненормальные" MP3 файлы, на которых спотыкаются многие программы, включая всем известный WinAmp. У меня есть один такой файл (может и больше - не знаю), в плейлисте длина равна 0 мин 00 сек, инфо вообще пустое (кроме, разве что ID3 тегов), но при проигрывании он правильно показывает длительность звучания, частоту, битрейт и моно/стерео. Даже MPAHeaderInfo, который очень часто хвалят, выдал длительность 00:00. Даже при полном сканировании. И только лишь огромная похапешная либа - http://getid3.sourceforge.net/ выдала всю инфу без ошибок. Но разбирать её и переделывать на си у меня пока нет вдохновения ![]() ![]() Если кому интересно - могу выложить данный файл. Прикреплённый файл ![]() |
Сообщ.
#25
,
|
|
|
У меня была аналогичная задача.
Выкладываю для WMA, она у меня получилась заметно короче. Звуковые параметры заполняются в структуру WAVEFORMATEX, длительность в секундах - в переменную DWORD по ссылке, текстовая информация - в структуру ID3v1. Касаемо поиска в mp3. Я использовал вариант: ищем с начала файла ff, а когда нашли, проверяем, что байт после него &0xe0 ==0xe0. Считаем это началом условного mp3 фрейма, вычисляем его длину, и убеждаемся, что после этого фрейма в файле также стоит ff, причем параметры заголовка второго фрейма должны совпадать с первым, 4 байта. Если (((l ^ next_l) & 0xffff0c00) !=0), то типы фреймов разные, и это вообще не фреймы, продолжаем поиск следующего ff. А если одинаковы, считаем первый фрейм началом звуковых данных, берём из фрейма битрейт, делим на него длину файла за минусом текущей позиции. Заголовок Xing пока не ищется и не анализируется, но он может оказаться только в первом фрейме. Есть аналогичные процедуры для файлов других форматов, с поиском файлов и составлением списка по формату, заданным пользователем. Если интересно, выложу исходники программы, там только голый си, никаких библиотек. Хелп от программы: MP3 filelist generator v1.14 support filetypes: mp3,wma,asf,wmv,ogg,ape,flac,wav,avi Usage: MP3LIST <dir> <outfile> [format_string] <format_string>==string with plain or control characters control characters: _ => space character %% => "%" character %_ => "_" character %\ => "\" character %[<NNN>]<field> => first <NNN> character of ID3tag field, space alignment if <NNN>=255 then no aligment if <NNN>=0 or skipped then used default field's width where <field>={f|v|t|a|l|c|y|s|b|r|d|D} (Filename,VolLabel,Title,Artist,aLbum,Comment,Year,Size,Bitrate,fReq,duration,DurationHMS) default format string: "%f_%a_%t_%y_%c" Прикреплённый файл ![]() |