суббота, 18 августа 2007 г.

Получение информации о видеофайле

Сегодня очень большое количество пользователей интернета регулярно скачивают фильмы с Bittorrent трекеров. Есть также люди (их гораздо меньше), которые эти фильмы на трекеры выкладывают. Эта статья, для тех, кто выкладывает. :)

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

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

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


1. Создание серии скриншотов из видеофайла

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


А называется найденная мной программа QFrameCatcher. Написана она на Qt, так что поклонникам GTK в этот раз не повезло. :)

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

Во всем остальном я ей очень доволен. Так что, если не брезгуете Qt приложениями, бегом на сайт производителя.


2. Получение информации о видеофайле

Когда я приступил к поиску программы для решения данной задачи, я подумал: "Ну уж тут то проблем точно не должно быть. Раз уж нашел программу, которая умеет делать скриншоты видеофайлов, то уж найти программу для отображения информации о них не составит труда." Естественно, я ошибся. :) Поиск не дал вообще никаких результатов. Тогда я пошел на форумы.

Поначалу там советовали что-нибудь вроде "запусти mplayer -v videofile и ищи там нужную тебе информацию". :) Такой вариант меня совсем не устраивал, т. к. обработать эту информацию каким-нибудь awk и вывести в более удобочитаемом виде практически не представлялась возможной, т. к. формат вывода этой информации менялся в зависимости от типа видеофайла.

Но в конце концов удача улыбнулась мне, и товарищ minder на Linuxforum.ru посоветовал мне программу MediaInfo, которая выдавала информацию во вполне удобочитаемом виде. Прочитав вывод mediainfo --Help я к своей необычайной радости узнал, что она, оказывается, может выдавать информацию на основании заданного вами шаблона. Как только я это узнал, то сразу же сел за написание скрипта, который выдавал бы мне только то, что я хочу, и так, как я хочу. А написание этого скрипта послужило поводом для данной статьи.

Вот собственно и сам скрипт:
#!/bin/bash
#***************************************************************************
#*   Copyright (C) 2007, Konishchev Dmitry                                 *
#*   http://konishchevdmitry.blogspot.com/                                 *
#*                                                                         *
#*   This program is free software; you can redistribute it and/or modify  *
#*   it under the terms of the GNU General Public License as published by  *
#*   the Free Software Foundation; either version 3 of the License, or     *
#*   (at your option) any later version.                                   *
#*                                                                         *
#*   This program is distributed in the hope that it will be useful,       *
#*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
#*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
#*   GNU General Public License for more details.                          *
#**************************************************************************/

# Скрипт получения информации о видеофайле
# Использование: get_video_info video_file1 video_file2 ...

for file in "$@"
do
if [ -f "$file" ]
then
{
echo "[b]Файл:[/b] $file"
mediainfo "$file" --Inform="General;FILE_SIZE: %FileSize/String4%\nTIME: %PlayTime/String%" \
| sed '
/FILE_SIZE/ s/Gib/Гб/
/FILE_SIZE/ s/MiB/Мб/
/FILE_SIZE/ s/KiB/Кб/
s/FILE_SIZE:/[b]Размер:[\/b]/
/TIME/ s/h/ ч/
/TIME/ s/mn/ мин/
/TIME/ s/s/ сек/
s/TIME:/[b]Продолжительность:[\/b]/'

mediainfo "$file" --Inform="Video;\nVIDEO: %Codec/String%, %Width%x%Height% (%AspectRatio%:1), %FrameRate/String%, %BitRate/String%" \
| sed 's/VIDEO:/[b]Видео:[\/b]/; s/Kbps/Кбит\/с/'

mediainfo "$file" --Inform="Audio;\nAUDIO: %Codec/String%, %SamplingRate% Hz, %BitRate_Mode% %BitRate/String%" \
| sed 's/AUDIO:/[b]Аудио:[\/b]/; s/Kbps/Кбит\/с/'
} | sed -r '/^\s*$/ d'
else
echo "Bad file: $file"
fi
done
Применив данный скрипт к одному или нескольким файлам, вы увидите примерно следующий результат:
Файл: Shpionka_V_1(17)_DVDRip_[torrents.ru].avi
Размер: 388.7 Мб
Продолжительность: 41 мин 24 сек
Видео: XviD, 720x400 (1.800:1), 25.000 fps, 1104 Кбит/с
Аудио: AC3, 48000 Hz, CBR 192 Кбит/с
Естественно, та информация, которую он выдает, далеко не предел для MediaInfo. Так что, если кому-то чего-то не хватает, смотрите mediainfo --Help. Данный скрипт - просто демонстрация работы программы.

Примечание: при написании скрипта использовалась MediaInfo версии 0.7.7.7. С остальными ее версиями я правильной работы гарантировать не могу (практика показывает, что некоторые версии работают некорректно).

Получить MediaInfo можно здесь.

На этом считаю данную тему освещенной. Надеюсь, что кому-нибудь эта информация пригодится.

13 комментариев:

Анонимный комментирует...

Спасибо, Дмитрий. Статья оказалось полезной, единственное, что MediaInfo отказывается выдавать информацию о видеофайлах, если те содержат кириллицу в своём имени.
Не сталкивались с подобным? =)
Локаль utf-8.

Dmitry Konishchev комментирует...

Не сталкивался. :) Как-то до сих пор под руку попадались только файлы с английскими названиями...

Побродил сейчас у них по сайту - нашел пару багрепортов:
[ 1537211 ] Errors with special characters in filenames
[ 1748623 ] Fails upon Cyrillic letter in file name

Судя по ответам, проблема есть и до сих пор не исправлена. Причем, похоже, проблема не в самом Mediainfo, а в библитеке, которую она использует. Так что тут, к сожалению, ничем помочь не могу. :(

Кстати, сейчас скачал более новую версию Mediainfo (0.7.5.5) - работает она не так хорошо, как та, на основе которой я писал свой скрипт (0.7.5.1). К примеру, не умеет определять соотношение сторон видеофайла. Так же есть и другие проблемы. Так что пока рекомендую использовать версию (0.7.5.1), с которой скрипт работает наиболее правильно.

А если в будущем выйдет новая версия, в которой появятся существенные улучшения, можно будет переделать скрипт под нее (если потребуется).

dimanish комментирует...

Ясно, спасибо за информацию.
Проблема на самом деле не слишком серьёзная, на крайний случай всегда можно переименовать файл, а потом "вернуть" ему старое имя. =)
Блог отличный, подчерпнул для себя полезную информацию из некоторых статей. Ещё раз спасибо.
[dimanish=анонимный :)]

Анонимный комментирует...

Доброе время суток, прошу прощения , не могли бы Вы сделать тоже самое, но только для Windows.
Очень полезный скрипт, но нет возможности поставить unix

Dmitry Konishchev комментирует...

Анонимный, а на чем же вы мне предлагаете сделать его под Windows? :) Там нет такого мощного интерпретатора команд, как в UNIX. По-моему, для Windows графические приложения гораздо предпочтительнее. У MediaInfo есть графическая оболочка под Windows. Рекомендую вам обратить свое внимание на нее.

Анонимный комментирует...

А не пробовали ли вы использовать для получение видеоинфы mplayer? - у него и поддрежка форматов более полная и он обычно имеется по умолчанию

Если есть какая нить инфа по этому поделитесь плиз

Dmitry Konishchev комментирует...

Нет, mplayer я отверг сразу, т. к. парсить его вывод значительно сложнее, а MediaInfo меня устраивал полностью.

Анонимный комментирует...

а вы не пробовали вариант wine + виндузовый bitrate viewer ?
http://www.tecoltd.com/bitratev.htm

Dmitry Konishchev комментирует...

Нет, кроме MediaInfo ничего не пробовал.

Анонимный комментирует...

%BitRate/String% для контейнера матроска не отображает битрейт.
Попробуйте вытащить инфу своим скриптом из файла с расширением mkv (Matroska)

Dmitry Konishchev комментирует...

Анонимный, если поставить последнюю версию (0.7.7.7), то, по крайней мере на тех файлах, на которых я ее испытывал, все нормально работает.

Анонимный комментирует...

А кто-нибудь в курсе, как написать шаблон вывода инфы так, чтобы перед инфо о субтирах был абзац, но если несколько субтитров, чтобы абзаца между ними не было. При этом, если несколько аудио потоков, то между ними тоже абзаца не должно быть.

oraerk комментирует...

Есть очень хороший скрипт, генерящий скриншоты: http://p.outlyer.net/vcs/