Re: Опыт настройки HMS и Sony W5500 + несколько вопросов
Posted: Sun Jan 16, 2011 2:39 pm
Немножко доделал профиль "Фильмы - TsMuxer+AUDIO" - добавил запуск с любой позиции. Соответственно, заработала перемотка. НО! Как всегда, не обошлось без порядочной ложечки дегтя Оказалось, что тсМуксер при задании стартовой позиции файла начинает муксирование НЕ с этой позиции ( ), а как бы "перематывает" файл с самого начала, и только по достижении нужного времени начинает муксирование Бред. В работе это выливается в то, что надо ставить значение "Прекращение транскодирования, если временный файл не используется" в 30 секунд (почему не больше - чуть дальше), дабы телику хватало времени дождаться начала потока Но и это еще не всё. При переходе на позицию, добраться до которой тсМуксеру надо более 30 секунд, добраться до нее не получается вообще - срабатывает, я так понимаю, таймаут телевизора (30 сек), ибо он пишет вместо "Воспроизведение невозможно" другую ошибку: "Не удается получить доступ к серверу"
Короче, одна засада. Я так понимаю, что просто тсМуксером сделать полноценный профиль с поддержкой всех дорожек НЕ получится. Я тут уже пробовал перейти на транскодирование через VLC, но пока что не совсем разобрался с его параметрами. Да и тут сразу же полезли странности: тестовое транскодирование проходит нормально, полученный файл читается на компе, НО на телик транскодируется битыми пикселями и с одной аудио Пробовал кинуть полученный файл просто в папку с фильмами, и получил ту же фигню. Пока что не хватает времени разобраться в свойствах полученного файла, чтобы понять, что в нем не так.
Вот что о нем говорит МедиаИнфо:
Посему у меня возникла самая кардинальная идея за все время эксплуатации моего W5500 Хочу обратиться к автору этой без преувеличения замечательнейшей программы с просьбой: помогите нам в создании профиля, который генерит НОРМАЛЬНЫЙ m2ts-файл (либо ts-поток) со всеми звуковыми дорожками и с разрешениями либо 1280х720, либо 1920х1080. В идеале, думаю, было бы классно, если бы БЕЗ транскодинга в поток передавались только форматы видео AVC(H264) и MPEG1/2, а аудио - AC3 и MP3. Но мне так кажется, что можно даже ВСЁ транскодировать на лету в MPEG2 и AC3 (6 каналов), лишь бы телик всё понимал и нормально перематывал.
Вот
З.Ы. Размеры нашей благодарности будут безграничны в пределах разумного
Code: Select all
const
csAC3TranscodingParams = '-i "%s" -acodec %s -ar 48000 -ab %d -map 0:%d -y -f %s "%s"';
function GetAudioBitrate(const aAudioCodec: string; aAudioBitrate: Integer): Integer;
begin
if MatchText(aAudioCodec, ['MP2', 'MP3']) and (aAudioBitrate > 320000) then
Result := 320000
else
Result := aAudioBitrate
end;
function GetAudioCodec(const aAudioCodec: string): string;
begin
if (aAudioCodec = '') or SameText(aAudioCodec, 'AC3') then
Result := 'ac3'
else if SameText(aAudioCodec, 'AAC') then
Result := 'libfaac'
else if SameText(aAudioCodec, 'MP3') then
Result := 'libmp3lame'
else if SameText(aAudioCodec, 'MP2') then
Result := 'mp2'
else if SameText(aAudioCodec, 'WMA') then
Result := 'wmav2'
else
Result := aAudioCodec
end;
function GetTsMuxerAudioCodec(const aAudioCodec: string): string;
begin
if (aAudioCodec = '') or SameText(aAudioCodec, 'AC3') then
Result := 'A_AC3'
else if SameText(aAudioCodec, 'AAC') then
Result := 'A_AAC'
else if SameText(aAudioCodec, 'MP3') then
Result := 'A_MP3'
else if SameText(aAudioCodec, 'MP2') then
Result := 'A_MP3'
else
Result := ''
end;
function GetAudioFormat(const aAudioCodec: string): string;
begin
if (aAudioCodec = '') or SameText(aAudioCodec, 'AC3') then
Result := 'ac3'
else if SameText(aAudioCodec, 'AAC') then
Result := 'adts'
else if SameText(aAudioCodec, 'MP3') then
Result := 'mp3'
else if SameText(aAudioCodec, 'MP2') then
Result := 'mp3'
else
Result := aAudioCodec
end;
function SameAudioCodec(const aAudioCodec: string; aCodecID: Integer): Boolean;
begin
if (aAudioCodec = '') or SameText(aAudioCodec, 'AC3') then
Result := aCodecID = CODEC_ID_AC3
else if SameText(aAudioCodec, 'AAC') then
Result := aCodecID = CODEC_ID_AAC
else if SameText(aAudioCodec, 'MP3') then
Result := aCodecID = CODEC_ID_MP3
else if SameText(aAudioCodec, 'MP2') then
Result := aCodecID = CODEC_ID_MP3
else if SameText(aAudioCodec, 'WMA') then
Result := aCodecID = CODEC_ID_WMAV2
else
Result := False
end;
var
i, iAudioStreamNo, iAudioCodecID, iVideoCodecID,
iAudioStreamID, iVideoStreamID: Integer;
MetaFileLines: TStringList;
sAudioInfo, sVideoInfo, sMetaFileName,
sInputVideoFileName, sInputAudioFileName,
sAC3TranscodingParams, sTimeShift,
sFPS, sLANG: string;
sAC3ReadPipeName, sAC3WritePipeName : Array[0..mpAudioStreams-1] of string;
begin
MetaFileLines := TStringList.Create;
try
sInputVideoFileName := mpFilePath;
sInputAudioFileName := mpFilePath;
if mpTimeStart <> '' then
MetaFileLines.Add('MUXOPT --no-pcr-on-video-pid --vbr --vbv-len=500 --cut-start='
+ IntToStr(HmsTimeConvert(mpTimeStart)) + 's')
else
MetaFileLines.Add('MUXOPT --no-pcr-on-video-pid --vbr --vbv-len=500');
iVideoCodecID := HmsGetStreamCodecID(stVideo, 0);
if iVideoCodecID > 0 then begin
if (iVideoCodecID = CODEC_ID_H264) or SameText(mpVideoCodec, 'H264') then
sVideoInfo := 'V_MPEG4/ISO/AVC, "%s", level=4.1, insertSEI, contSPS'
else if (iVideoCodecID = CODEC_ID_MPEG2VIDEO) or SameText(mpVideoCodec, 'MPEG2VIDEO') then
sVideoInfo := 'V_MPEG-2, "%s"'
else if (iVideoCodecID = CODEC_ID_VC1) or SameText(mpVideoCodec, 'VC1') then
sVideoInfo := 'V_MS/VFW/WVC1, "%s"'
else
sVideoInfo := '';
end;
if sVideoInfo <> '' then begin
if SameText(ExtractFileExt(mpFilePath), '.mkv') then begin
iVideoStreamID := HmsGetStreamIndex(stVideo, 0) + 1;
end else begin
iVideoStreamID := HmsGetStreamID(stVideo, 0);
if SameText(ExtractFileExt(mpFilePath), '.vob') then begin
iVideoStreamID := iVideoStreamID and 255;
end;
end;
sFPS := 'fps=%2.3f';
sFPS := Format(sFPS, [mpFrameRate]);
sFPS := ReplaceStr(sFPS, ',', '.');
sVideoInfo := sVideoInfo + ', track=%d, %s, lang=';
sLANG := HmsGetStreamLanguage(stVideo, iVideoStreamID);
if SameText(sLANG, '') then sLANG := 'eng';
sVideoInfo := sVideoInfo + sLANG;
MetaFileLines.Add(Format(sVideoInfo, [sInputVideoFileName, iVideoStreamID, sFPS]));
end;
for i := 0 to mpAudioStreams-1 do begin
iAudioStreamNo := i;
sInputAudioFileName := mpFilePath;
iAudioCodecID := HmsGetStreamCodecID(stAudio, iAudioStreamNo);
if iAudioCodecID = CODEC_ID_AC3 then
sAudioInfo := 'A_AC3'
else if iAudioCodecID = CODEC_ID_DTS then
sAudioInfo := 'A_DTS'
else if iAudioCodecID = CODEC_ID_MP3 then
sAudioInfo := 'A_MP3'
else if iAudioCodecID = CODEC_ID_MP2 then
sAudioInfo := 'A_MP3'
else if iAudioCodecID = CODEC_ID_AAC then
sAudioInfo := 'A_AAC'
else
sAudioInfo := '';
if sAudioInfo <> '' then begin
if SameText(ExtractFileExt(mpFilePath), '.mkv') then begin
iAudioStreamID := HmsGetStreamIndex(stAudio, iAudioStreamNo) + 1;
end else begin
iAudioStreamID := HmsGetStreamID(stAudio, iAudioStreamNo);
if SameText(ExtractFileExt(mpFilePath), '.vob') then begin
iAudioStreamID := iAudioStreamID and 255;
end
end;
if not SameAudioCodec(cfgTranscodingAudioCodec, iAudioCodecID) then begin
if HmsCreateDualPipe(sAC3ReadPipeName[i], sAC3WritePipeName[i], 10000000) then begin
sAC3TranscodingParams := Format(csAC3TranscodingParams,
[mpFilePath, GetAudioCodec(cfgTranscodingAudioCodec ),
GetAudioBitrate(cfgTranscodingAudioCodec, cfgTranscodingAudioBitrate),
HmsGetStreamIndex(stAudio, iAudioStreamNo),
GetAudioFormat(cfgTranscodingAudioCodec), sAC3WritePipeName[i]]);
if HmsTranscodingExecute('HMSMPEG', sAC3TranscodingParams, False) then begin
sInputAudioFileName := sAC3ReadPipeName[i];
sAudioInfo := GetTsMuxerAudioCodec(cfgTranscodingAudioCodec);
iAudioStreamID := 1;
end
end
end;
sTimeShift := HmsGetVideoSettings(vstAudioDelay);
if sTimeShift <> '' then
sTimeShift := Format(', timeshift=%ss', [sTimeShift]);
sAudioInfo := sAudioInfo + ', "%s", ' + 'track=%d' + sTimeShift;
sAudioInfo := sAudioInfo + ', lang=';
sLANG := HmsGetStreamLanguage(stAudio, iAudioStreamNo);
if SameText(sLANG, '') then sLANG := 'eng';
sAudioInfo := sAudioInfo + sLANG;
MetaFileLines.Add(Format(sAudioInfo, [sInputAudioFileName, iAudioStreamID]));
end;
end;
sMetaFileName := ChangeFileExt(OutputFileName, '.meta');
MetaFileLines.SaveToFile(sMetaFileName);
OutputFileName := ChangeFileExt(OutputFileName, '.m2ts');
TranscodingResult := HmsTranscodingExecute('TSMUXER', '"' + sMetaFileName + '" "' + OutputFileName + '"', True);
finally
MetaFileLines.Free
end
// end
end.
Вот что о нем говорит МедиаИнфо:
Code: Select all
Название свойства/значение | |
- | Общее |
| | Идентификатор: 30ED
| | Полное имя: J:\VIDEO\Юмор\Test_4869a1a679694384a9862b3941e15d46.m2ts
| | Формат: MPEG-TS
| | Размер файла: 200 МиБ
| | Продолжительность: 2 м. 31 с.
| | Общий поток: 11,1 Мбит/сек
- | Видео |
| | Идентификатор: 74 (0x4A)
| | Идентификатор меню: 1 (0x1)
| | Формат: MPEG Video
| | Версия формата: Version 2
| | Профайл формата: Main@High 1440
| | Параметры BVOP формата: Нет
| | Параметры матрицы формата: По умолчанию
| | Format_Settings_GOP: M=1, N=12
| | Идентификатор кодека: 2
| | Продолжительность: 2 м. 31 с.
| | Вид битрейта: Постоянный
| | Битрейт: 8000 Кбит/сек
| | Ширина: 1280 пикс.
| | Высота: 720 пикс.
| | Соотношение кадра: 16:9
| | Частота кадров: 24,000 кадр/сек
| | ColorSpace: YUV
| | ChromaSubsampling: 4:2:0
| | BitDepth/String: 8 бит
| | Тип развёртки: Прогрессивная
| | Бит/(Пиксели*Кадры): 0.362
| | Размер потока: 141 МиБ (71%)
| | Язык: English
- | Аудио #1 |
| | Идентификатор: 68 (0x44)
| | Идентификатор меню: 1 (0x1)
| | Формат: AC-3
| | Формат/Информация: Audio Coding 3
| | Format_Settings_ModeExtension: CM (complete main)
| | Идентификатор кодека: 129
| | Продолжительность: 2 м. 31 с.
| | Вид битрейта: Постоянный
| | Битрейт: 448 Кбит/сек
| | Канал(ы): 6 канала(ов)
| | Расположение каналов: Front: L C R, Side: L R, LFE
| | Частота: 44,1 КГц
| | BitDepth/String: 16 бит
| | Размер потока: 8,11 МиБ (4%)
| | Язык: Russian
- | Аудио #2 |
| | Идентификатор: 69 (0x45)
| | Идентификатор меню: 1 (0x1)
| | Формат: AC-3
| | Формат/Информация: Audio Coding 3
| | Format_Settings_ModeExtension: CM (complete main)
| | Идентификатор кодека: 129
| | Продолжительность: 2 м. 31 с.
| | Вид битрейта: Постоянный
| | Битрейт: 448 Кбит/сек
| | Канал(ы): 6 канала(ов)
| | Расположение каналов: Front: L C R, Side: L R, LFE
| | Частота: 44,1 КГц
| | BitDepth/String: 16 бит
| | Размер потока: 8,11 МиБ (4%)
| | Язык: Russian
Вот
З.Ы. Размеры нашей благодарности будут безграничны в пределах разумного