воскресенье, 9 января 2011 г.

Характеристики медиа-файлов в файл-листах

Привет.

В результате анализа жалоб на неверное определение битрейта mp3 файлов была опробована
внешняя библиотека mediainfo которая позволяет получить большую информацию о разных файлах и не дает ошибок на присланных файлах в формате mp3.

Предлагаемые изменения в структуре файл-листа.
1. Отображается битрейт звука на всех айдио и видео файлах.
2. Отображается размер Ширина x Высота на фалах видео и изображений(фотки).




Желающие могут попробовать тестовую сборку
FlylinkDC-r500-mediainfo-test-1.rar

и высказать замечания...(тест лучше делать в отдельном каталоге)
Мне пока не понравилось несколько моментов
1. тормознутость либы на avi. (она для определения размеров видео зачем-то читает все кино :))
2. неверное определения битрейта если в кино две дорожки.
3. может размер фотографий лишнее и его можно выкинуть :)
4. упало при ночном нагрузочном тесте хеширвания всего винта


технически полученные данные сохраняются в таблице fly_file в двух новых колонках в момент хеширования. и в последующем отдаются клиентам в тэге WH XML документа.

Т.к. я mediainfo ковыряю всего один день.. возможно что-то не так сделал.
ниже сырой исходный код получения данных параметров буду благодарен если что-то подскажите.
p.s.
через некоторое время исходники вкомичу в бранч
http://flylinkdc.googlecode.com/svn/branches-dev/ppa/r5xx-mediainfo-integration
после успешных тестов волью в основной ствол разработки.


void HashManager::getMediaInfo(const string& p_name, uint16_t& p_bitrate,uint16_t& p_mediaX, uint16_t& p_mediaY)
{
/*
TODO
1 - оптимизнуть и не открывать левые расширения
2 - исключить удвоение битрейта (вероятно когда две или более аудио дорожки) возвращается число 320000320000
3 -
*/
static MediaInfoDLL::MediaInfo m_media_info_dll; //[+]PPA
p_bitrate = 0;
p_mediaX = 0;
p_mediaY = 0;
if(!m_media_info_dll.IsReady())
return;
try
{
string l_sinfo = Text::fromT( m_media_info_dll.Option(_T("Info_Version"), _T("")).c_str());
m_media_info_dll.Option(_T("Internet"), _T("No"));
if(m_media_info_dll.Open(Text::toT(p_name)) )
{
const TCHAR* l_MediaInfoQuery = _T("Inform");
m_media_info_dll.Option(l_MediaInfoQuery, _T("Audio;%BitRate%"));
l_sinfo = Text::fromT(m_media_info_dll.Inform());
p_bitrate = atoi(l_sinfo.c_str())/1000;
m_media_info_dll.Option(l_MediaInfoQuery, _T("Image;%Width%x%Height%"));
l_sinfo = Text::fromT(m_media_info_dll.Inform());
if(!l_sinfo.empty())
{
string::size_type l_pos = l_sinfo.find('x');
if(l_pos != string::npos)
{
p_mediaX = atoi(l_sinfo.c_str());
p_mediaY = atoi(l_sinfo.c_str() + l_pos + 1);
}
}
else
{
m_media_info_dll.Option(l_MediaInfoQuery, _T("Video;%Width%x%Height%"));
l_sinfo = Text::fromT(m_media_info_dll.Inform());
if(!l_sinfo.empty())
{
string::size_type l_pos = l_sinfo.find('x');
if(l_pos != string::npos)
{
p_mediaX = atoi(l_sinfo.c_str());
p_mediaY = atoi(l_sinfo.c_str() + l_pos + 1);
}
}
m_media_info_dll.Close();
}
}
Отправить комментарий