Верну тему к жизни, потому как вопрос по аудиотрекам до сих пор актуален.
Alexander Great wrote:Пытаюсь добиться, чтобы можно было переключаться между звуковыми дорожками кнопкой "Audio" на пульте.
Переделал профиль "основной". Коряво, но вроде работает...
Code: Select all
IfThen(mpInternetItem,
HmsTranscodingProfileParams('Интернет-телевидение'),
IfThen(mpSubItemsCount > 0,
HmsTranscodingDvdParams,
IfThen(mpAudioStreams > 1,
( HmsTranscodingInputParams + HmsTranscodingVideoParams
+ HmsTranscodingMapParams(mpAudioStreamNo)
+ ' "<OUTPUT FILE>"'
+ ReplaceStr(HmsTranscodingMapParams(mpAudioStreamNo+1),'-map 0:0',''))
+ HmsTranscodingAudioCodecParams(cfgTranscodingAudioBitrate, False)
+ ' -newaudio',
(HmsTranscodingInputParams + HmsTranscodingVideoParams
+ HmsTranscodingMapParams(mpAudioStreamNo))
))
)
Может кто нибудь поможет сделать аналогичное для профиля "TsMuxer"?
Добавил я себе сразу после этого сообщения новый профиль "Фильмы (основной)+AUDIO" со скриптом, приведенным выше, и долгое время не мог нарадоваться - две дорожки аудио можно было менять на лету во время воспроизведения. Я забил на то, что дорог можно было использовать только две, благо, большинство фильмов в моей фильмотеке как раз с двумя дорожками (рус-англ). Но некоторая часть ХД-фильмов всё-таки валяется в mkv, и дорожек там часто больше двух!

Сначала я эти фильмы запускал через папку "Транскодирование" с выбором нужного звука, но ... Я ж ленивый

, да и программирование часто практикую для облегчения всяких рабочих моментов. Вот и тут я таки решил докопаться до сути и покурить скрипты под HMS.

Докурился

Накурил такой профиль:
Code: Select all
var
i, nAudio, nPos: Integer;
sParams, sTransParamNew: string;
begin
nAudio:=mpAudioStreams;
if mpInternetItem then
TranscodingParams := HmsTranscodingProfileParams('Интернет-телевидение')
else if mpSubItemsCount > 0 then
TranscodingParams := HmsTranscodingDvdParams
else begin
if nAudio > 1 then begin
nPos:= mpAudioStreamNo ;
sParams := HmsTranscodingInputParams + HmsTranscodingVideoParams
+ HmsTranscodingMapParams(mpAudioStreamNo)
+ ' "<OUTPUT FILE>" ';
for i:=0 to nAudio-1 do begin
if i<>nPos then begin
sTransParamNew:=ReplaceStr(HmsTranscodingMapParams(i),'-map 0:0','');
sTransParamNew:=ReplaceStr(sTransParamNew,'-vstreamid 1','');
sParams := sParams + sTransParamNew
+ HmsTranscodingAudioCodecParams(cfgTranscodingAudioBitrate, false)
+ ' -newaudio';
end;
sParams:=ReplaceStr(sParams,'-vstreamid 1','-map 0:0');
for i:=2 to 99 do begin
sParams := ReplaceStr(sParams, '-astreamid '+IntToStr(i), '-map 0:'+ IntToStr(i-1));
end
end
end
else begin
sParams := HmsTranscodingInputParams + HmsTranscodingVideoParams
+ HmsTranscodingMapParams(mpAudioStreamNo);
end;
TranscodingParams := sParams;
end;
end.
Сразу же хочу объяснить, почему новый метод выбора треков (
-vstreamid х, -astreamid х) я заменил на
-map 0:х -- почему-то даже при указании правильного
astreamid при тестовом транскодировании на все звуковые дороги мапилась ПОСЛЕДНЯЯ по счету

Т.е. результирующий список дорог выглядел так:
Code: Select all
Stream mapping:
Stream #0.0 -> #0.0
Stream #0.6 -> #0.1
Stream #0.6 -> #0.2
Stream #0.6 -> #0.3
Stream #0.6 -> #0.4
Stream #0.6 -> #0.5
Stream #0.6 -> #0.6
Замена на
-map 0:х сработала правильно (ниже полный лог):
Code: Select all
"C:\Program Files (x86)\Home Media Server\hmsmpeg.exe" -probesize 7000000 -analyzeduration 5000000 -i "J:\VIDEO\Мультики
\Шрек\Шрек-2 -2004- 720p rus(5)+eng(1).mkv" -f dvd -vcodec mpeg2video -b 8000000 -aspect 16:9 -copyts -pix_fmt yuv420p
-s 1280x720 -threads 2 -acodec copy -map 0:0 -map 0:4 "J:\TEMP\HmsTemp\Test_4869a1a679694384a9862b3941e15d46.mpg" -map
0:1 -acodec ac3 -ab 448000 -ar 48000 -ac 6 -newaudio -map 0:2 -acodec ac3 -ab 448000 -ar 48000 -ac 6 -newaudio -map 0
:3 -acodec ac3 -ab 448000 -ar 48000 -ac 6 -newaudio -map 0:5 -acodec ac3 -ab 448000 -ar 48000 -ac 6 -newaudio -map 0:6
-acodec ac3 -ab 448000 -ar 48000 -ac 6 -newaudio -v 1
FFmpeg version SVN-r25702, Copyright (c) 2000-2010 the FFmpeg developers
built on Nov 24 2010 13:41:21 with gcc 4.5.0
[matroska,webm @ 0026ad60] max_analyze_duration reached
[matroska,webm @ 0026ad60] Estimating duration from bitrate, this may be inaccurate
Input #0, matroska,webm, from 'J:\VIDEO\╨Ь╤Г╨╗╤М╤В╨╕╨║╨╕\╨и╤А╨╡╨║\╨и╤А╨╡╨║-2 -2004- 720p rus(5)+eng(1).mkv':
Duration: 01:32:23.94, start: 0.000000, bitrate: 2944 kb/s
Stream #0.0(eng): Video: h264, yuv420p, 1280x720, PAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc
Metadata:
title : Ripped by Outline, addon by SerGoLeOne
Stream #0.1(rus): Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s
Metadata:
title : ╨Ф╤Г╨▒╨╗╤П╨╢ (AC3) 384kbps
Stream #0.2(rus): Audio: dca, 48000 Hz, 5.1, s16, 768 kb/s
Metadata:
title : ╨У╨░╨▓╤А╨╕╨╗╨╛╨▓, ╨╛╨┤╨╜╨╛╨│╨╛╨╗╨╛╤Б╤Л╨╣ (DTS) 768kbps
Stream #0.3(rus): Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
Metadata:
title : ╨У╨╛╨▒╨╗╨╕╨╜, ╨╛╨┤╨╜╨╛╨│╨╛╨╗╨╛╤Б╤Л╨╣ [╨┐╤А╨░╨▓╨╕╨╗╤М╨╜╨░╤П ╨▓╨╡╤А╤Б╨╕╤П] (AC3)1 448kbps
Stream #0.4(rus): Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
Metadata:
title : ╨У╨╛╨▒╨╗╨╕╨╜, ╨╛╨┤╨╜╨╛╨│╨╛╨╗╨╛╤Б╤Л╨╣ [╤Б╨╝╨╡╤И╨╜╨╛╨╣ ╨┐╨╡╤А╨╡╨▓╨╛╨┤] (AC3) 448kbps
Stream #0.5(rus): Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
Metadata:
title : ╨Ь╨╜╨╛╨│╨╛╨│╨╛╨╗╨╛╤Б╤Л╨╣ (AC3) 448kbps
Stream #0.6(eng): Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
Metadata:
title : ╨Р╨╜╨│╨╗╨╕╨╣╤Б╨║╨╕╨╣ (AC3) 384kbps
Stream #0.7(rus): Subtitle: [0][0][0][0] / 0x0000
Metadata:
title : ╨У╨╛╨▒╨╗╨╕╨╜
[buffer @ 022a1a10] w:1280 h:720 pixfmt:yuv420p
[dvd @ 022bdfd0] VBV buffer size not set, muxing may fail
Output #0, dvd, to 'J:\TEMP\HmsTemp\Test_4869a1a679694384a9862b3941e15d46.mpg':
Metadata:
encoder : Lavf52.84.0
Stream #0.0(eng): Video: mpeg2video, yuv420p, 1280x720 [PAR 1:1 DAR 16:9], q=2-31, 8000 kb/s, 90k tbn, 23.98 tbc
Metadata:
title : Ripped by Outline, addon by SerGoLeOne
Stream #0.1(rus): Audio: ac3, 48000 Hz, 5.1, 448 kb/s
Metadata:
title : ╨У╨╛╨▒╨╗╨╕╨╜, ╨╛╨┤╨╜╨╛╨│╨╛╨╗╨╛╤Б╤Л╨╣ [╤Б╨╝╨╡╤И╨╜╨╛╨╣ ╨┐╨╡╤А╨╡╨▓╨╛╨┤] (AC3) 448kbps
Stream #0.2(rus): Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
Metadata:
title : ╨Ф╤Г╨▒╨╗╤П╨╢ (AC3) 384kbps
Stream #0.3(rus): Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
Metadata:
title : ╨У╨░╨▓╤А╨╕╨╗╨╛╨▓, ╨╛╨┤╨╜╨╛╨│╨╛╨╗╨╛╤Б╤Л╨╣ (DTS) 768kbps
Stream #0.4(rus): Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
Metadata:
title : ╨У╨╛╨▒╨╗╨╕╨╜, ╨╛╨┤╨╜╨╛╨│╨╛╨╗╨╛╤Б╤Л╨╣ [╨┐╤А╨░╨▓╨╕╨╗╤М╨╜╨░╤П ╨▓╨╡╤А╤Б╨╕╤П] (AC3)1 448kbps
Stream #0.5(rus): Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
Metadata:
title : ╨Ь╨╜╨╛╨│╨╛╨│╨╛╨╗╨╛╤Б╤Л╨╣ (AC3) 448kbps
Stream #0.6(eng): Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
Metadata:
title : ╨Р╨╜╨│╨╗╨╕╨╣╤Б╨║╨╕╨╣ (AC3) 384kbps
Stream mapping:
Stream #0.0 -> #0.0
Stream #0.4 -> #0.1
Stream #0.1 -> #0.2
Stream #0.2 -> #0.3
Stream #0.3 -> #0.4
Stream #0.5 -> #0.5
Stream #0.6 -> #0.6
Press [q] to stop encoding
frame= 1092 fps= 62 q=2.0 size= 28550kB time=45.50 bitrate=5139.8kbits/s
Но!!! Это всё было классно, пока я тестировал скрипт на компе. Первые же тесты на телике повергли меня в шок: аудиодорожек как было, так и осталось ДВЕ

При этом видно, что чем больше у исходного файла дорог, тем дольше он запускается на воспроизведение, т.е. транскодинг идет нормально! И маппинг правильный, т.е. первый звук - это дефолтная дорожка, второй звук - первая недефолтная по списку из файла. Но остальных телик не понимает!!! Я перерыл туеву хучу инфы в инете, и так и не смог выяснить - это ограничение самого телевизора (две озвучки) или же всё-таки что-то не то с транскодингом??? Кто-нибудь может подсказать?
З.Ы. Телик 32W5500, HMS 1.17rc1