1 (2015.12.08 21:36:00 отредактировано d1mas)

Тема: Профиль Фильмы (оптимальный) не цепляет внешнюю аудиодорожку

Прошу помощи.

Понравилась мне концепция универсального профиля для транскодирования в зависимости от возможностей конечного устройства воспроизведения. Здорово ведь. Построил один раз таблицу совместимости и забыл. И все правки можно вносить в один единственный профиль, если что-то захочется доработать.
Здорово еще и то, что в этом профиле четко считается соотношение сторон фильма и устройства воспроизведения и можно забыть про допилку и прочие костыли с перехватом командной строки ffmpeg. Здесь же можно и все параметры кодеков и аппаратное ускорение обработки вставить. В-общем лепота.
И все бы хорошо, только сразу наткнулся на косяк, справиться с которым пока не получается. Суть в следующем:
Есть фильм, к нему отдельно скачал английскую аудиодорожку. Подцепил. Выбрал ее. В карточке все выглядит культурно.

+ открыть спойлер

https://hms.lostcut.net/misc.php?action=pun_attachment&item=404

Видеодорожка, аудиодорожка с русской озвучкой и ниже внешняя аудиодорожка с англ озвучкой.
Установил профиль - Фильмы (оптимальный). Настроил таблицу для телика.
Запускаю фильм на телике - фигвам. Запускаю выборочно другие - работает все чудесно.
Делаю тестовое транскодирование - получаю ошибку в параметре -map.
Смотрю на строку транскодирования и вижу косяк. Там нет упоминания о файле с внешней аудиодорожкой. Вот так она выглядит (взял из дебага):

probesize 7000000 -analyzeduration 10000000 -i "G:\download!video\Practical.Magic.1998.HDRip.All.Films.RG\Practical.Magic.1998.HDRip.All.Films.RG.avi" -f dvd -vcodec mpeg2video -q:v 0 -pix_fmt yuv420p -vf "scale=1280:540,pad=1280:720:0:90:0x000000,setdar=16:9" -threads 4 -acodec ac3 -ab 448000 -ar 48000 -ac 6 -map 0:0 -map 0:2 ""

А вот так выглядит строка после профиля Фильмы (дополнительный), да и после основного:

-probesize 7000000 -analyzeduration 10000000 -probesize 7000000 -analyzeduration 10000000 -i "G:\download!video\Practical.Magic.1998.HDRip.All.Films.RG\Practical.Magic.1998.HDRip.All.Films.RG.avi" -i "G:\download!video\Practical.Magic.1998.HDRip.All.Films.RG\Practical.Magic.1998.HDRip.All.Films.RG.Eng.ac3" -f dvd -vcodec mpeg2video -q:v 0 -pix_fmt yuv420p -acodec ac3 -ab 448000 -ar 48000 -ac 6 -vf "scale=1280:540,pad=1280:720:0:90:0x000000,setdar=16:9" -map 0:0 -map 1:0 -threads 4

Да, там два раза -probesize 7000000 -analyzeduration 10000000, но это не мешает. А вот отсутствие упоминания о файле с внешней дорожкой режет глаз не только мне, но и самому HMS, ибо транскодировать он это отказывается. Обратите внимание на мапы видео и аудио. Аудио различается.

Моих познаний хватило для того, чтобы понять, что при обработке аудиодорожки в профиле Фильмы оптимальный, скрипт считает, что аудио упаковано в том же файле, и формирует строку для транскода, исходя из этой уверенности. При этом параметры кодека, кол-ва каналов и проч он вполне замечательно получает из недр HMS.

Очень прошу знатоков и профи помочь с доработкой профиля для корректного взаимодействия с внешними аудио дорогами и субтитрами. Да и разработчику потом отправим, пусть чинит.

Заранее благодарю.

Прикреплённые файлы сообщения

film.jpg 157.74 kb, скачивалось 207 раз, начиная с 2015.12.08

2

Re: Профиль Фильмы (оптимальный) не цепляет внешнюю аудиодорожку

Попробуем разобраться.
Не знаю, может вы знаете, но до меня не сразу дошло.... Что профили транскодирования можно выполнять в отладчике. Для этого нужно сначала выделить ссылку на видео фильм и потом пойти в Настройки, Транскодер, Профили, выбрать интересующий профиль, открыть его скрипт и начать отладку прям там. И он будет срабатывать на текущую ссылку.

Sony Bravia KDL-32CX523

3 (2015.12.09 00:43:35 отредактировано d1mas)

Re: Профиль Фильмы (оптимальный) не цепляет внешнюю аудиодорожку

WendyH пишет:

Попробуем разобраться.
Не знаю, может вы знаете, но до меня не сразу дошло.... Что профили транскодирования можно выполнять в отладчике. Для этого нужно сначала выделить ссылку на видео фильм и потом пойти в Настройки, Транскодер, Профили, выбрать интересующий профиль, открыть его скрипт и начать отладку прям там. И он будет срабатывать на текущую ссылку.

Я так и делал. А еще там можно выбрать профиль устройства, для которого выполняется скрипт. Собственно все цитаты из этого дебага. Но самостоятельно разобраться у меня не получилось :(

4 (2015.12.19 19:07:08 отредактировано d1mas)

Re: Профиль Фильмы (оптимальный) не цепляет внешнюю аудиодорожку

Что удалось выяснить.

Оновные профили транскодирования принимают на входе вот эту переменную:

HmsTranscodingInputParams

И при наличии внешней аудиодорожки ее содержимое соответствует действительности:

HmsTranscodingInputParams = -probesize 7000000 -analyzeduration 10000000  -probesize 7000000 -analyzeduration 10000000 -i "<INPUT FILE>" -i "G:\download\!video\Practical.Magic.1998.HDRip.All.Films.RG\Practical.Magic.1998.HDRip.All.Films.RG.Eng.ac3"

Видим два параметра -i, один с шаблоном имени файла фильма, второй с файлом внешней аудиодорожки.
Потом эта конструкция обрастает опциями преобразования файла и размера картинки, субтитрами и прочим, а так же двумя параметрами -map для видео и аудио.
Все работает корректно.

А вот профиль "Фильмы (оптимальный)" собирает эту строку немного по-другому.
Сначала HmsTranscodingProbeParams (это первые две опции из примера),
затем проверка на смещение времени начала просмотра и добавление при необходимости опции -ss HH:MM:SS,
затем проверка на тип исходного файла и добавление опции -f mpeg при необходимости.
затем к этой конструкции лепятся опции размера картинки, видео и аудио кодеков, субтитров - в нашем случае несущественно.
И вот затем начинается самое интересное:

if bMapStreams then                           
sTranscodingParams := sTranscodingParams + Format(' -map 0:%d -map 0:%d', [HmsGetStreamIndex(stVideo, 0), HmsGetStreamIndex(stAudio, iAudioStreamNo)]);

Вот тут происходит второй "косяк". Ну то-есть по логике профиля все правильно. Он не предусматривает наличия внешней аудио дорожки.

Опция -map указывает транскодеру, какие потоки в исходных файлах нужно использовать. Первая цифра - (номер файла-1), вторая - (номер потока в файле-1)
Т.е. профиль всегда использует основной файл для выбора потока и видео и звука.
В нашем случае должно быть не -map 0:0 -map 0:2, а -map 0:0 (видеопоток) -map 1:0 (аудио дорожка).

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

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

Есть же переменная InputFileName, ну наверняка автор предусмотрел соответствующие переменные для внешних ресурсов.
Ну, например: mpAudioSelected не подходит. Она прокатит, если заранее пометить аудиодорожку в HMS. А если пользователь решил выбрать дорожку прямо с устройства через папку транскодирование? Правильно - mpAudioSelected = null.
Еще вариант. Сочетание двух переменных mpAudioStreamList и HmsGetStreamParam('A',iAudioStreamNo,siStreamFilePath). Оно на первый взгляд работает. Потестировал. Показывает идентичные результаты и при выборе дорожки в HMS и при запуске через транскодирование. Тут делов - отпарсить путь к файлу и пару условий внести в скрипт.

Но почти уверен, есть более правильное решение в недрах HMS.

Зачем это все? Да в этом профиле можно реализовать большую часть уже опубликованных на форуме наработок. И с AR, и scale, и с акселерацией, автоподстановкой субтитров  и пр.
Причем просто добавляя процедурку в профиль. Без костылей и регекспов.

UPD

Благодаря любезно предоставленному WendiH оффлайн справочнику переменных и функций HMS раскопал вот такую конструкцию:

HmsGetStreamParam('A',iAudioStreamNo,siStreamFilePath)

Если результат вызова этой функции не null, то он содержит искомый нами путь к внешней дорожке.

И потом так:

HmsTranscodingMapParams(iAudioStreamNo);

5 (2015.12.19 19:47:49 отредактировано d1mas)

Re: Профиль Фильмы (оптимальный) не цепляет внешнюю аудиодорожку

Очередная запись в блоге :)
Видимо, Евгений, автор HMS, сюда заглядывает, ну или звезды сошлись.
Собственно профиль он скорректировал и выложил на форуме поддержки HMS.
http://homemediaserver.ru/forum/viewtop … amp;t=4415
Эта тема закрыта, но от намерений по расширению функционала профиля я не отказываюсь и обязательно реализую свои задумки.
Евгений, если вы это читаете - спасибо.

P.S.
И, Евгений, если Вы это читаете, функция HmsGetStreamLanguage в случае внешней дорожки возвращает еще и полный путь к файлу... ;)