1

Тема: VBS: Ищу пример чтения bitrate из потока mp3 файла

Доброго времени суток товарищи. ) Ни у кого не пробегало примера как выдернуть bitrate из mp3 файла ? Желательно на VBS. )

Почитал статьи
http://www.mpgedit.org/mpgedit/mpeg_for … ormat.html
http://en.wikipedia.org/wiki/MP3

Нашёл даже пару примеров по выдёргиванию ID3 тэгов через Shell.Application. Но как это надёргать из байтового потока пока нормальных примеров не нарыл.

Буду благодарен ссылкам и примерам. Заранее спасибо.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

2 (изменено: abasov, 2011-11-17 12:32:01)

Re: VBS: Ищу пример чтения bitrate из потока mp3 файла

Xameleon пишет:

Доброго времени суток товарищи. ) Ни у кого не пробегало примера как выдернуть bitrate из mp3 файла

Пример на Shell.Application, из байтового потока пока не нашел.

strFolder = "E:\"
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(strFolder)
Set colFiles = objFolder.Items

If Not objFolder Is Nothing Then
For Each objFile In colFiles
   strType = objFolder.GetDetailsOf(objFile, 2)
   If strType = "MPEG Layer 3 Audio File" Then
       WScript.Echo "Name:", objFile.Name 
       WScript.Echo "Bit Rate:", objFolder.GetDetailsOf(objFile, 23)
   End If
Next
End If

3

Re: VBS: Ищу пример чтения bitrate из потока mp3 файла

Полагаю, что алгоритм достаточно прост:
1. проверить существование ID3 тегов
2. если есть тег, то его обойти и встать в начало первого фрейма
3. прочитать заголовок фрейма
4. разобрать фрейм
5. если необходимо, то перейти к следующему фрейму и снова п.3

Много полезной информации находится здесь
http://www.mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm
http://www.id3.org/id3v2.4.0-structure

Xameleon пишет:

примера как выдернуть bitrate из mp3 файла ? Желательно на VBS

Коллега, я понимаю, что желательно на VBS, но мне хотелось и самому попробовать что-то накопать, не вдаваясь в подробности битовых операций в VBS. Поэтому я использовал Перл, так как у него есть очень простые и удобные (на мой взгляд) средства для работы с двоичными файлами и битовыми данными. Не обессудьте.

Я специально писал без использования библиотек, чтобы посмотреть самому. Уверен, что CPAN есть соответствующие пакеты.

#!/usr/bin/perl -w

my $BUF;

my $filename = $ARGV[0];
open F, $filename or die "Cannot open file $filename\n";
binmode F, ":raw";

# Check ID3 at the begin of a file
read F, $BUF, 3;
if ( $BUF ne "ID3" ) {
    seek F, 0, 0;
} else {
    # Read the rst of the ID3
    read F, $BUF, 7;

    my ($id3_ver, $id3_rev, undef, $id3_size) = unpack("CCCN", $BUF);

    $id3_size = (($id3_size & 0xff000000) >> 1) + ($id3_size & 0x00ffffff);
    $id3_size = (($id3_size & 0xffff0000) >> 1) + ($id3_size & 0x0000ffff);
    $id3_size = (($id3_size & 0xffffff00) >> 1) + ($id3_size & 0x000000ff);

    printf "ID3v2.%d.%d\nSize: %d (%04x)\n\n", 
        $id3_ver, $id3_rev, 
        $id3_size, $id3_size;

    seek F, $id3_size, 1;
}

# Read the first frame's header
read F, $BUF, 4;

close F;

my @MPEG  = (
    "MPEG Version 2.5", 
    "reserved", 
    "MPEG Version 2", 
    "MPEG Version 1"
);
my @LAYER = (
    "reserved", 
    "Layer III", 
    "Layer II", 
    "Layer I"
);
my %BRATE = (
    "33" => ["free",  32,  64,  96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, "bad"], 
    "32" => ["free",  32,  48,  56,  64,  80,  96, 112, 128, 160, 192, 224, 256, 320, 384, "bad"], 
    "31" => ["free",  32,  40,  48,  56,  64,  80,  96, 112, 128, 160, 192, 224, 256, 320, "bad"], 
    "23" => ["free",  32,  48,  56,  64,  80,  96, 112, 128, 144, 160, 176, 192, 224, 256, "bad"], 
    "22" => ["free",   8,  16,  24,  32,  40,  48,  56,  64,  80,  96, 112, 128, 144, 160, "bad"], 
    "21" => ["free",   8,  16,  24,  32,  40,  48,  56,  64,  80,  96, 112, 128, 144, 160, "bad"], 
);
my %SAMPLE = (
    "3" => [44100, 48000, 32000, "reserv"], 
    "2" => [22050, 24000, 16000, "reserv"], 
    "0" => [11025, 12000,  8000, "reserv"], 
);

my $mp3_header = unpack("N", $BUF);

my $mp3_mpeg   = ($mp3_header & 0x00180000) >> 19;
my $mp3_layer  = ($mp3_header & 0x00060000) >> 17;
my $mp3_brate  = ($mp3_header & 0x0000f000) >> 12;
my $mp3_sample = ($mp3_header & 0x00000c00) >> 10;
my $mp3_pad    = ($mp3_header & 0x00000200) >> 9;

my $bitrate = %BRATE->{"$mp3_mpeg$mp3_layer"}->[$mp3_brate];
my $sample  = %SAMPLE->{"$mp3_mpeg"}->[$mp3_sample];

my $frame = int(
    $mp3_layer == 3 
    ? (12000 * $bitrate / $sample + $mp3_pad) * 4 
    : 144000 * $bitrate / $sample + $mp3_pad
);

printf "%s\n%s\n\nBitrate : %s\nSample  : %s\nPadding : %s\nFrame   : %s\n", 
    $MPEG[$mp3_mpeg], 
    $LAYER[$mp3_layer], 
    $bitrate, 
    $sample, 
    $mp3_pad, $frame;
( 2 * b ) || ! ( 2 * b )

4

Re: VBS: Ищу пример чтения bitrate из потока mp3 файла

2 abasov:

abasov пишет:

Пример на Shell.Application, из байтового потока пока не нашел.

Именно поэтому я и написал

Нашёл даже пару примеров по выдёргиванию ID3 тэгов через Shell.Application. Но как это надёргать из байтового потока пока нормальных примеров не нарыл.

Такой код у меня уже имеется и он мне не подходит. ) 

2 Rumata:
Вот и я такого кода нашёл тоннами. ) Но перегнать его на VBS у меня пока что не получилось.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

5

Re: VBS: Ищу пример чтения bitrate из потока mp3 файла

вот нашел класс, у меня битрейт вычисляет неверно, хотя теги считывает нормально.

6

Re: VBS: Ищу пример чтения bitrate из потока mp3 файла

Xameleon пишет:

Но перегнать его на VBS у меня пока что не получилось

А-а-а. Так Вам нужна помощь по конвертации )))

( 2 * b ) || ! ( 2 * b )

7

Re: VBS: Ищу пример чтения bitrate из потока mp3 файла

Xameleon, а откуда байтовый поток берётся?

8

Re: VBS: Ищу пример чтения bitrate из потока mp3 файла

Запрашиваю с сервера кусок mp3 файла. ) Первые 100-200 байт. Ну смотря сколько потребуется. ) Для качалки музыки с vkontakte.ru. Хочу показывать в интерфейсе битрейт файла.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

9

Re: VBS: Ищу пример чтения bitrate из потока mp3 файла

Xameleon, письмо получил. Спасибо, идея и причины такой реализации понятны. Я разве что попробовал воспроизвести один из файлов непосредственно с URL посредством объекта «WMPlayer.OCX.7» — получилось, но весьма медленновато. Причём, скажем, для локального файла могу получить битрейт, для воспроизводимого с URL — нет.

OFF: Честно говоря, работать со сложной бинарной структурой с наличием необязательных полей на VBS/JS — ужас. Даже, когда формат подробно описан. У меня, в принципе, был единственный опыт — настройка параметров ярлыка, специфичных для консольного приложения (скажем прямо — ярлыка Far Manager'а , хотя годится и для обычной консоли) — шрифт, начертание, размеры окна и буфера окна. Есть желание сделать там же человеческое задание палитры цветов для консоли, но всё откладываю.

10

Re: VBS: Ищу пример чтения bitrate из потока mp3 файла

alexii пишет:

....получилось, но весьма медленновато

Есть такое дело. Мне приходится работать с бесплатного хостинга (у которого канал довольно сильно ограничен) и вдобавок через бесплатный русский прокси сервер, т.к если работаю напрямую, то при авторизации получаю ошибку. На сколько я понял из-за анонимности запросов. Ну я думаю Вы представляете цепочку связи. ) Сначала запрос уходит "за бугор", потом там происходит запрос к контакту через русский прокси и потом возвращается обратно. ) И так происходит не только авторизация, но и скачка файлов. Я сделал ASP страницу, которая прокачивает весь поток MP3 файла через себя. Другого способа не нашёл, т.к при скачке проверяется IP с которого авторизовася пользователь. Если они не совпадают, то сервер отвечает 404 Not Found.

alexii пишет:

Причём, скажем, для локального файла могу получить битрейт, для воспроизводимого с URL — нет.

Подозреваю, что это последствия того, что я транслирую не все заголовки которыми отвечает сервер контакта при скачке mp3 файлов. ) Надо будет поизучать чем он отвечает.

Но все эти неудобства временные. Моей целью было добиться работы скриптов без использования сторонник компонентов. А там уже если сервис будет развиваться, то перейду на нормальный хостинг. )

alexii пишет:

Честно говоря, работать со сложной бинарной структурой с наличием необязательных полей на VBS/JS — ужас.

Полностью согласен. Но всё же надеюсь справиться )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

11

Re: VBS: Ищу пример чтения bitrate из потока mp3 файла

Отчасти не в тему. Некоторое время назад я решил себе поставить greasemonkey/scriptish. Так под них существует юзер-скрипт (vkontakte music download), который просматривает страницу и добавляет после каждого аудиотрека прямую ссылку на скачивание. Вдруг это может полезным.

( 2 * b ) || ! ( 2 * b )

12

Re: VBS: Ищу пример чтения bitrate из потока mp3 файла

2 Rumata:

Именно от этого варианта я и ушёл. И от VKSaver-а тоже.

В случае VKSaver это сомнительное (на мой взгляд) ПО, которое:
1) получает доступ к моей странице и мониторит по каким сайтам я перехожу.
2) Получает полный доступ к ресурсам моего компьютера.
3) Код приложения закрыт. Следовательно о том, что оно делает, мне остаётся только догадываться.
4) Вдобавок ещё и самостоятельно обновляется из интернета.

Для большинства - это "Ыыы. полезная прога !!! КУЛ !!!". Для меня же это троянец чистой воды. ) Сегодня он может быть безобиден, а завтра.... [Не хочу обижать разработчиков. Может быть и правда они исполнены только благими намерениями помочь пользователям. Ну тогда могли бы и код своего приложения открыть. Раз скрывать нечего.]

На счёт скриптов типа "greasemonkey". Меньший зловред, по ощущениям, но:
1) Не универсален. Я часто качаю музыку с телефона находясь в метро или машине.
2) Скрипт надо часто обновлять, т.к интерфейс и HTML содержимое страницы контакта меняется. И разработчик не всегда успевает это делать. В случае моего ресурса - API контакта более постоянны.

И общий пункт для скриптов и VKSaver-а: при скачке таким образом нельзя указать тип содержимого, которое хочешь получить с сервера. А у многих пользователей, которые пользуются моим ресурсом на работе (а качают они чаще всего от туда) заблокирована скачка mp3. Я же на своём ресурсе могу "отдать" им содержимое с любым ContentType и именем. )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

13

Re: VBS: Ищу пример чтения bitrate из потока mp3 файла

Xameleon пишет:

Именно от этого варианта я и ушёл

Я предполагал ответ, похожий на этот. ))) Возможно там, в скрипте, можно найти некоторые ответы на некоторые вопросы.

( 2 * b ) || ! ( 2 * b )

14

Re: VBS: Ищу пример чтения bitrate из потока mp3 файла

Ну на некоторые возможно. ) Но не на мой. Там в скрипте код по "выдёргиванию" ссылок для скачки. Но к моему вопросу это имеет малое отношение. )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !