Хочу поделиться опытом 3-х недель колупания с медиа-сервером и телеком Sony. Возможно будет полезен владельцам и других телевизоров.
Итак. Дано:
1) Старый дохлый комп на котором хранится около терабайта фильмов, большинство из которых в MKV, и нужно все это проиграть.
2) Более менее современный ноут на Core 2 Duo 8400, на который и установлен HMS.
3) Телек Сони W5500 на котором и хочется все это добро посмотреть, причем, что очень удивило: качество картинки, даже траснкодированной, через DLNA субъективно выше чем через HDMI кабель с компа. Из-за этого собственно и было принято решение начинать разбираться.
Затык первый: телевизор.
У Сони есть 3 ограничения на просмотр HD:
1) Контейнер должен быть m2ts
2) Видео поток должен быть закодирован в H264 с профилем 4.1
3) Самое досадное: разрешение картинки должно быть 1920х1080 или 1280х720
Как будем бороть?
Для MKV файлов с разрешением картинки 1920х1080 или 1280х720 используем профиль "Фильмы - TsMuxer", но с одной маааленькой доделкой.
Меняем строку профиля "Фильмы - TsMuxer" и профиля "Фильмы - DirectShow - TsMuxer"
Code: Select all
sVideoInfo := 'V_MPEG4/ISO/AVC, "%s", insertSEI, contSPS'
Code: Select all
sVideoInfo := 'V_MPEG4/ISO/AVC, "%s", level=4.1, insertSEI, contSPS'
Несмотря на то, что вышеуказанного процессора явно хватает для транскодирования в реальном времени фильмов в 720р, происходит следующее: кодирование начинается со скоростью 50-60 fps и плавно падает до менее 25 при загрузке процессора менее 30%. Не помогает даже повышение приоритета транскодера.
Как будем бороть?
Воспользовавшись советом на форуме, попробовал прикрутить профиль "Фильмы - CoreAVC". Это помогло, но держать в системе CoreAVC не имея видеокарты nVidia мне как-то недосуг. Я скопировал профиль "Фильмы - CoreAVC" и заменил в нем строку
Code: Select all
if not CheckResult(HmsDirectShowAddFilter('CoreAVC Video Decoder', 'Video Decoder')) then
Code: Select all
if not CheckResult(HmsDirectShowAddFilter('Microsoft DTV-DVD Video Decoder', 'Video Decoder')) then
Затык третий: директ шоу.
Фильмы, имеющие ширину (именно ширину, высота кадра до лампочки) отличную от 1280 и 1920 не воспроизводятся при использовании директ шоу декодеров + ffmpeg. Никаких.
Как будем бороть?
Очевидно, что придется использовать для таких фильмов обычный транскодирующий профиль "Фильмы - (Основной)". На более низких, чем 720р, разрешениях он уже не тормозит.
Суммируя, получается, что приходится использовать 3 профиля по такому алгоритму:
Code: Select all
if res=1280x720 or res=1920x1080 then "Фильмы - TsMuxer - Level 4.1" elsif (width=1280 and height < 720) or (width=1920 and height < 1080) then "Фильмы - Microsoft DTV-DVD Video Decoder" else "Фильмы - (Основной)"
Вопрос второй: почему при использовании транскодера hmsmpeg (он же ffmpeg, как я понял) скорость кодирования неприемлемо падает, хотя явно процессор не нагружен на все 100?
Вопрос третий (животрепещущий): может все же есть какая-то возможность надурить телевизор, чтобы смотреть HD с высотой кадра не 720 и не 1080 без перекодирования? Хотя ответ я на него и так знаю.
Вопрос четвертый (feature request): Непонятно почему, если в настройках HMS я снимаю галку "Русские названия папок", все равное часть надписей остается по русски, например "интервал 10 мин", "первая звуковая дорожка" и тд. Ну просто я предпочитаю, чтобы все было на каком-то одном языке. Лучше на англ.
И еще кусочек опыта: использовать битрейты траскодера выше 8 мегабит нету никакого смысла, в большинстве случаев получите buffer underflow, а если 8 мегабит все же маловато ffmpeg сам немного поднимет битрейт.
Отдельно, хотел бы выразить благодарность авторам программы: спасибо! Особенно нравится, как реализована поддержка ДВД.