Русское сообщество по скриптингу

Инклуд для разбора mp3-файлов. Версия 0.0.1 Alpha.

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

Инклуд для разбора mp3-файлов. Версия 0.0.1 Alpha.

Сообщение Chuvi » 10 июл 2012, 03:07

Собственно, не знаю, в какой раздел это поместить. Это вроде как и не "болтовня", и не готовый плагин, и пока ещё не совсем "Статья/фрагмент кода". Ладно, пусть будет в болтовне. Хотя, имхо, это не самая разумная мысль.

На создания данного инклуда меня подтолкнула Вы должны зарегистрироваться, чтобы видеть ссылки. от Вы должны зарегистрироваться, чтобы видеть ссылки. для расчёта длительности wav-файла, и желание создать функцию для проверки mp3-файла на возможность воспроизведения с помощью клиента counter-strike.

Да, в процессе написания данного инклуда, я посторался избежать объявления каких-либо переменных в функциях. Поэтому, небольшая просьба: если вы будете что-нибудь сюда привносить, посторайтесь поступать также.


Итак.
Версия 0.0.1 Alpha
Добавлено:
  1. Функции для разбора заголовка mp3-фрейма
  2. Массивы для нормального отображения некоторых данных.
Необходимо сделать:
  1. Проверить и исправить ошибки.
  2. Было замечено, что маркер mp3-фрейма может внезапно встретиться в пределах ID3v2 тэга, который как правило, расположен в начале mp3-файла. Нужна функция, которая будет определять размер ID3v2 тэга.
  3. Также было замечено, что маркер mp3-фрейма может встречаться в странных местах. Короче, надо это проверять. :(
  4. Реализовать функции для разбора ID3 и ID3v2 тэгов.
  5. Реализовать функции для разбора VBR-заголовков.
  6. При необходимости попытаться реализовать преобразователь кодировки ID3 и ID3v2 тэгов в UTF-8.
    для того, чтобы их можно было отображать в кс (Сомневаюсь, что осуществимо)
  7. Реализовать функцию для определения времени проигрывания mp3-файла.
  8. Реализовать функцию для определения возможности проигрывания данного mp3-файла в CS.
  9. Реализовать функции для проверки CRC заголовка фрейма.

Пример использования:
[spoiler][pawn]
  1. #include <amxmodx>

  2. #include <amxmisc>

  3. #include <mp3>

  4.  

  5. #define PLUGIN "mp3.test"

  6. #define VERSION "1.0"

  7. #define AUTHOR "Chuvi"

  8.  

  9.  

  10. public plugin_init() {

  11.         register_plugin(PLUGIN, VERSION, AUTHOR)

  12.         register_srvcmd("mp3_test","mp3_test")

  13.         // Add your code here...

  14. }

  15. new mp3_file[33]="sound/test.mp3"

  16.                        

  17.        

  18. public find()

  19. {

  20.         new mp3=fopen(mp3_file,"rb")

  21.         new start

  22.         start=MP3_Frame_Start(mp3)     

  23.         server_print("Frame found at %i",start)

  24.         server_print("MPEG version is %i (%s)",MP3_MPEG_Version(mp3,start),MP3_MPEG_Version_Array[MP3_MPEG_Version(mp3,start)])

  25.         server_print("Layer version is %i (%s)",MP3_Layer_Version(mp3,start),MP3_Layer_Version_Array[MP3_Layer_Version(mp3,start)])

  26.         server_print("MP3_Protection_Bit= %i",MP3_Protection_Bit(mp3,start))

  27.         server_print("MP3_Bitrate= %i",MP3_Bitrate(mp3,start))

  28.         server_print("MP3_Sampling_Rate= %i",MP3_Sampling_Rate(mp3,start))

  29.         server_print("MP3_Padding_Bit=%i",MP3_Padding_Bit(mp3,start))

  30.         server_print("MP3_Private_Bit=%i",MP3_Private_Bit(mp3,start))

  31.         server_print("MP3_Channel_Mode=%s",MP3_Channel_Mode_Array[MP3_Channel_Mode(mp3,start)])

  32.         server_print("MP3_Mode_Extension=%s", MP3_Mode_Extension_Array[MP3_Layer_Version(mp3,start)][MP3_Mode_Extension(mp3,start)])

  33.         server_print("MP3_Copyright_Bit=%i",MP3_Copyright_Bit(mp3,start))

  34.         server_print("MP3_Original_Bit=%i",MP3_Original_Bit(mp3,start))

  35.         server_print("MP3_Emphasis=%s^n",MP3_Emphasis_Array[MP3_Emphasis(mp3,start)])

  36.         fclose(mp3)

  37. }

  38.  

  39.  
[/pawn][/spoiler]

Если кому интересно покопаться в спецификации mp3:
Вы должны зарегистрироваться, чтобы видеть ссылки.
Вы должны зарегистрироваться, чтобы видеть ссылки.
Вы должны зарегистрироваться, чтобы видеть ссылки.
Последний раз редактировалось Chuvi 11 июл 2012, 11:04, всего редактировалось 1 раз.
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.

Re: Инклуд для разбора mp3-файлов. Версия 0.0.1 Alpha.

Сообщение Plrip » 10 июл 2012, 22:05


Status:
Аватара пользователя
Plrip
Скриптер
 
Сообщения: 2903
Зарегистрирован: 03 дек 2011, 19:33
Откуда: Ukraine
Благодарил (а): 237 раз.
Поблагодарили: 603 раз.
Языки программирования: Counter-Strike 1.6
X-Ray
Killing-Floor [low]

Re: Инклуд для разбора mp3-файлов. Версия 0.0.1 Alpha.

Сообщение Fedcomp » 10 июл 2012, 22:18

PRoSToTeM@ писал(а):
Fedcomp писал(а):Может быть полезен например для зомби сервера, чтобы автоматически узнавать длину проигрываемой бэкграунд музыки.

А зачем её узнавать?

Чтобы можно было после одной запустить другую, а то они в нахлест пойдут если время треков не верно выставленное.
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4936
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 813 раз.
Поблагодарили: 1317 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

Re: Инклуд для разбора mp3-файлов. Версия 0.0.1 Alpha.

Сообщение Chuvi » 11 июл 2012, 12:19

Добавил в шапку ссылки на найденные спецификации.
Кто хочет-может покопаться. Авось что интересное узнает. (Мдя. Будем расширять ваш кругозор. Ну не только же PAWN-ом вам заниматься. :-D )

Помогите, пожалуйста, понять, какие байты нужно использовать для расчёта CRC.
Как я понял, нужно взять 2 последних байта из заголовка фрейма и "указанное количество байт"(32 для стерео, 17 для моно) из "audio-data".
При этом байты, в которых хранится CRC (2 байта после заголовка фрейма) надо пропустить.
То есть нужно взять 2 последних байта из заголовка, пропустить 2 байта, в которых хранится CRC, и взять ещё некоторое кол-во байт, в зависимости от режима стерео/моно.

В общем, или я что-то не так понял, или одно из 2-х, но у меня рассчётное CRC никак не хочет совпадать с тем, что хранится в файле.

И заодно, напомните, мне, пожалуйста, такую вещь:
Насколько я помню, mp3 это MPEG-1 Layer 3. Однако википедия Вы должны зарегистрироваться, чтобы видеть ссылки.:
Википедия писал(а):MP3 (более точно, англ. MPEG-1/2/2.5 Layer 3; но не MPEG-3)

Собственно, вопрос в том: относится ли MPEG-2 Layer 3 и MPEG-2.5 Layer 3 к mp3, или википедия как всегда "не является источником достоверной информации"?

Так же, немного переписана одна из основных функций. И если подтвердиться, что mp3 это только MPEG-1 Layer 3, то она будет переписана ещё раз :)
Версию 0.0.2 Alpha пока не выкладываю, ибо кроме этой функции в ней пока особых изменений нет.
[spoiler][pawn]
  1. stock MP3_Frame_Start(mp3_file,Seek_Pos=0)

  2. {

  3.         /*0.0.2 Alpha--->

  4.         В версии 0.0.2 Alpha в функцию были добавлены некоторые проверки, позволяющие более точно (но, к сожалению со 100% вероятностью)

  5.         сказать, действительно ли это начало mp3-фрейма, или просто биты так совпали.

  6.         Как минимум нам нужно проверить такие параметры, как:

  7.         Версию MPEG (MP3_MPEG_Version не должна вернуть 1),

  8.         Версию Layer(MP3_Layer_Version должна вернуть 1 (так как mp3 это MPEG-1/2/2.5 Layer 3)),

  9.         Битрейт (MP3_Bitrate не должна вернуть 0)

  10.         Частоту дискретизации (MP3_Sampling_Rate не должна вернуть 0)

  11.        

  12.         Так как в этих функциях указатель на текущую позицию в файле смещается, придётся ввести переменную,

  13.         которая его запомнит.

  14.         --->0.0.2 Alpha*/

  15.        

  16.        

  17.         /*

  18.         Функция принимает указатель на открытый mp3 файл и позицию бита, с которого нужно начат искать mp3-фрейм

  19.         (Seek_Pos добавлено после того, как обнаружено, что данная сигнатура может быть найдена в теле ID3v2 тэга.)

  20.         Функция возвращает позицию байта, с которого начинается mp3 фрейм или -1 при ошибке.

  21.        

  22.         Немного теории.

  23.         [0-10] Маркер – 11 бит, заполненные единицами (Frame sync). Распологается в нулевом байте mp3-фрейма

  24.         целиком, и в 1-м байте частично. С него начинается заголовок mp3-фрейма.

  25.          

  26.         В байте 8 бит. Значит нам нужно найти байт, который будет равен 255 (11111111),и убедиться,

  27.         что следующий байт заканчивается на 111. Для того, чтобы в этом убедиться, сместим полученный

  28.         байт на 5 бит вправо с помощью побитового сдвига. Если результат равен 7, значит это то, что мы искали.

  29.         Осталось вернуть позицию байта, с которого начанается фрейм. Так как первые 2 байта фрейма

  30.         мы уже прочитали, нужно из текущей позиции вычесть 2.

  31.        

  32.         0.0.2 Alpha--->

  33.         Место предполагаемого начала mp3-фрейма будет сохранено в переменной Proposed_Frame_Location.

  34.         Если подтвердиться, что "похоже, это mp3-фрейм", то будет возвращена эта переменная.

  35.         --->0.0.2 Alpha

  36.         */

  37.        

  38.        

  39.         fseek(mp3_file, 0, SEEK_END)

  40.         if(Seek_Pos>ftell(mp3_file))

  41.                 return -1

  42.                

  43.         /*0.0.2 Alpha--->*/

  44.         new Proposed_Frame_Location //Предполагаемое место начала mp3-фрейма

  45.         /*--->0.0.2 Alpha*/

  46.                

  47.         fseek(mp3_file,Seek_Pos,SEEK_SET)

  48.         while(!feof(mp3_file))

  49.         {

  50.                 if(fgetc(mp3_file)==255)

  51.                 {

  52.                        

  53.                         if(fgetc(mp3_file)>>5==7)

  54.                         {

  55.                                 /*0.0.2 Alpha--->*/

  56.                                 Proposed_Frame_Location=ftell(mp3_file)-2

  57.                                 if

  58.                                 (

  59.                                         MP3_MPEG_Version(mp3_file,Proposed_Frame_Location)!=1 &&

  60.                                         MP3_Layer_Version(mp3_file,Proposed_Frame_Location)==1 &&

  61.                                         MP3_Bitrate(mp3_file,Proposed_Frame_Location)!=0 &&

  62.                                         MP3_Sampling_Rate(mp3_file,Proposed_Frame_Location)!=0

  63.                                 )

  64.                                 {

  65.                                         /*

  66.                                         По-хорошему, здесь надо проверить CRC, если есть что проверять.

  67.                                         Однако функции, проверяющей CRC у нас пока что нет.

  68.                                         */

  69.                                         return Proposed_Frame_Location

  70.                                 }

  71.                                 else

  72.                                 {

  73.                                         /*

  74.                                         Если таки оказалось, что это не mp3-фрейм, нужно возвратить указатель в файле на метсто,

  75.                                         так как за счёт предыдущих функций он уехал чёрти куда.

  76.                                         Мы должны выставить указатель на следующий байт от того байта, который мы посчитали началом фрейма.

  77.                                         Иначе мы застрянем на одном и том же байте.

  78.                                         */

  79.                                         fseek(mp3_file,Proposed_Frame_Location+1,SEEK_SET)

  80.                                 }

  81.                                 /*--->0.0.2 Alpha*/

  82.                                 // return ftell(mp3_file)-2; //Убрано в версии 0.0.2 Alpha.

  83.                         }

  84.                        

  85.                 }

  86.         }

  87.         return -1

  88. }

  89.  

  90.        

  91.  
[/pawn][/spoiler]

Добавлено спустя 8 минут 1 секунду:
KORD_12.7 писал(а):Chuvi, аналог Вы должны зарегистрироваться, чтобы видеть ссылки. у тебя выходит?

Судя по моим копаниям в спецификациях, у меня будет более правильный аналог.
В предложенном тобой инклуде, например, рассчёт смещения данных с конца файла учитывает только наличие тэга ID3v1 или ID3v1.1. Однако, (внезапно) перед ними может хранится ещё текст песни. То есть это никак не учитывается.
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.

Re: Инклуд для разбора mp3-файлов. Версия 0.0.1 Alpha.

Сообщение Chuvi » 11 июл 2012, 17:31

Вот странно. Когда вопрос касается чего-нибудь сложнее блокировки выстрелов для дуэли или создания менюшек все сразу куда-то сливаются.
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.

Re: Инклуд для разбора mp3-файлов. Версия 0.0.1 Alpha.

Сообщение Plrip » 11 июл 2012, 17:33

я здесь :-D

Status:
Аватара пользователя
Plrip
Скриптер
 
Сообщения: 2903
Зарегистрирован: 03 дек 2011, 19:33
Откуда: Ukraine
Благодарил (а): 237 раз.
Поблагодарили: 603 раз.
Языки программирования: Counter-Strike 1.6
X-Ray
Killing-Floor [low]

Re: Инклуд для разбора mp3-файлов. Версия 0.0.1 Alpha.

Сообщение Chuvi » 11 июл 2012, 17:36

Plrip, от тебя толку ноль.
Пилять. Что такое "полином" в CRC и с чем его едят.
И каким чудом, например, полином x^16 + x^12 + x^5 + 1 обозначается как 0x1021?
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.

Re: Инклуд для разбора mp3-файлов. Версия 0.0.1 Alpha.

Сообщение DJ_WEST » 12 июл 2012, 16:26

Вы должны зарегистрироваться, чтобы видеть ссылки.

Если файл закодирован с постоянным битрейтом – то мы уже можем наконец-то! получить длительность нашего трека по следующей формуле:
Длительность = Размер аудиоданных / Битрейт (в битах!) * 8

Например, файл имеет размер 350670 байт. Есть ID3v1 теги (128 байт) и ID3v2 теги (1024 байта). Битрейт = 96. Следовательно размер аудиоданных равен 350670 – 128 – 1024 = 349518 байт.
Длительность = 349518 / 96000 * 8 = 29,1265 = 29 секунд
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Инклуд для разбора mp3-файлов. Версия 0.0.1 Alpha.

Сообщение Chuvi » 12 июл 2012, 18:01

DJ_WEST, у меня в коментариях есть ссылка на эту страницу на хабрахабре. :)

Но так как-то не интересно. Гораздо веселее посчитать кол-во фреймов и умножить на длительность фрейма в секундах, ибо она всегда постоянная и не зависит от битрейта и прочих радостей.
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.

Re: Инклуд для разбора mp3-файлов. Версия 0.0.1 Alpha.

Сообщение Chuvi » 17 июл 2012, 17:08

Инклуд не умер. Автор пытается его переделать под модуль для amxmodx... а ещё лучше под плагин для метамода. Правда как это будет выглядить, автор пока не знает. :)
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.

Re: Инклуд для разбора mp3-файлов. Версия 0.0.1 Alpha.

Сообщение liFe iS GoOD » 21 дек 2013, 01:16

Chuvi писал(а):Инклуд не умер. Автор пытается его переделать под модуль для amxmodx... а ещё лучше под плагин для метамода. Правда как это будет выглядить, автор пока не знает. :)


Судя за время которое прошло , Вы забили на данную разработку , и можно считать , что инклуд умер.
Аватара пользователя
liFe iS GoOD
Модератор
 
Сообщения: 1416
Зарегистрирован: 24 май 2012, 19:48
Благодарил (а): 116 раз.
Поблагодарили: 472 раз.

Пред.След.

Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 6