Опыт настройки HMS и Sony W5500 + несколько вопросов

Alex Commandor
Posts: 21
Joined: Sat Mar 13, 2010 2:22 pm

Re: Опыт настройки HMS и Sony W5500 + несколько вопросов

Post by Alex Commandor »

Уффф... Пока что удалось запустить mkv, как хотелось, через такой профиль (это доработанный "Фильмы - TsMuxer+AUDIO"):

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 := 'mp2'
  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_MP2
  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
      sTimeShift := HmsGetVideoSettings(vstAudioDelay);
      if sTimeShift <> '' then
        sTimeShift := Format(', timeshift=%ss', [sTimeShift]);
      sInputVideoFileName := mpFilePath;
      sInputAudioFileName := mpFilePath;

      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_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]) 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;
          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.
С потоками (pipe) для перекодирования DTS на лету в АС3 вроде разобрался, заработало. Звуковые дорожки переключает ВСЕ!!! :roll: Добавил передачу тсМуксеру значения фпс из потока (на всякий случай) и добавил для каждой дороги идентификатор языка (тоже на всякий случай :) ). Единственный обнаруженный пока что минус - не работает перемотка и переход по времени :cry: Пока что это не очень страшно, но иногда нужно. Буду рыть еще.
Да, и пришлось добавить для AVC (h264) конвертацию в level=4.1, потому как оказалось, что телек высшие профили не понимает.

З.Ы. AVI-шек у меня нету с количеством аудио больше двух, так что с ними пока отлично справляется "Фильмы (основной)+AUDIO".

З.З.Ы. Да, и по-прежнему телик понимает только стандартные разрешения :( - тоже буду ковырять.
HMS 1.21.2 + Sony KDL32W5500, Win7 x64 Ultimate, Core2Duo E8500 3.16GHz, 8GB RAM, ATI Radeon 4870HD 512MB + NVIDIA GeForce GT 440 1GB (hybrid PhysX)
Alexander Great
Posts: 99
Joined: Wed Mar 10, 2010 9:24 am

Re: Опыт настройки HMS и Sony W5500 + несколько вопросов

Post by Alexander Great »

Сразу говорю. Что со старым "Фильмы - TsMuxer + Audio", что с обновленным, если mkv с LPCM звуком, TsMuxer просто рушится. С дефолтным работает.

И с новым профилем действительно не работает перемотка. :-( Думаю, что просто задать контейнер m2ts мало. Нужно подкрутить MIME типы.

>>Да, и пришлось добавить для AVC (h264) конвертацию в level=4.1, потому как оказалось, что телек высшие профили не понимает

Да, это обязательно.
Alexander Great
Posts: 99
Joined: Wed Mar 10, 2010 9:24 am

Re: Опыт настройки HMS и Sony W5500 + несколько вопросов

Post by Alexander Great »

Исправляюсь. На 50% фильмов со стандартным разрешением "Фильмы - TsMuxer + Audio" просто обрушивает tsmuxer. Я не нашел закономерности. На остальных работает. Дорожки переключаются. Перемотки нет. Более того, если принудительно запустить фильм скажем с 10 минут, все равно стартует сначала. :(

>>Да, и по-прежнему телик понимает только стандартные разрешения - тоже буду ковырять.

Не мучайтесь. Это похоже на аппаратное ограничение телевизора.

Я нашел ДВД-ишку с 3-мя дорожками (AC3 5.1 + AC3 2.0 + LPCM). Переключает только 2. Сцуко.
Alex Commandor
Posts: 21
Joined: Sat Mar 13, 2010 2:22 pm

Re: Опыт настройки HMS и Sony W5500 + несколько вопросов

Post by Alex Commandor »

Странно, у меня тсМуксер не сваливается :( И файлов с дорожками LPCM у меня нету, только AC3 и DTS :( Но я на досуге тоже где-то таких наковыряю. Я тут сейчас проверяю возможность менять на лету и видео под стандартные размеры ;) Пока всё очень коряво :)
HMS 1.21.2 + Sony KDL32W5500, Win7 x64 Ultimate, Core2Duo E8500 3.16GHz, 8GB RAM, ATI Radeon 4870HD 512MB + NVIDIA GeForce GT 440 1GB (hybrid PhysX)
Alexander Great
Posts: 99
Joined: Wed Mar 10, 2010 9:24 am

Re: Опыт настройки HMS и Sony W5500 + несколько вопросов

Post by Alexander Great »

Alex Commandor wrote:Странно, у меня тсМуксер не сваливается :(
У меня сваливается не на всех фильмах. Причем что под ХР (на домашнем компе), что под Win7 (на ноуте).
Alex Commandor wrote:Я тут сейчас проверяю возможность менять на лету и видео под стандартные размеры ;)
Это называется транскодирование. ;) По другому картинку нельзя достроить. Возможно вы хотите соорудить один профиль на все случаи жизни, под наши телевизоры? Это, наверное, было бы полезно. Я уже пробовал. Понял, что слишком сложно.

А переключение между дорожками сделать, это было бы очень классно и полезно.

Кстати, вы обратили внимание, что когда начинаешь тестовое транскодирование дефолтным профилем TsMuxer, в окне муксера сразу показывается "чего-то там 100%", а звук транскодируется в отдельном окне ffmpeg. А при попытке тестового транскодирования вашим профилем, муксер начинает что-то долго и нудно муксить. По мере просмотра фильма, процент растет. Предполагаю, что из-за этого не работает перемотка. Наверное, в первом случае, муксер только меняет заголовки файла, а в случае с вашим профилем, пытается замуксить весь контент, начиная только от начала фильма.
Lamoboy
Posts: 45
Joined: Wed Dec 30, 2009 11:38 am
Location: Киев
Contact:

Re: Опыт настройки HMS и Sony W5500 + несколько вопросов

Post by Lamoboy »

Alex Commandor wrote:
Lamoboy wrote:Alex Commandor, выложите, пожалуйста, свою конфигурацию HMS.
Не вопрос, ловИте. Только не думаю, что она сильно Вам поможет - у меня практически всё по-умолчанию. Единственное, это дефолтный профиль транскодирования "Фильмы - Основной + Audio", да буфер в памяти на 1 гиг вместо использования диска. Не, я соврал, - что-то еще я менял, но, вроде, незначительное. ПосмОтрите.
Спасибо за конфигурацию! Есть несколько вопросов:
1. Не перескакивает ли у Вас воспроизведение на следующий видеофайл в папке? Дело в том, что у меня при использовании оперативки для транскодирования и установленной опции Chunked такое имеет место быть.
2. Вы не используете опцию изменение оригинального размера кадра ТОЛЬКО если оригинальный больше, т.е. никогда (мне еще не попадалось видео больше 1080p)? Мне нравится смотреть видео на весь экран, телевизор прекрасно справляется с масштабированием изображения сам.

У меня тоже практически все стоит по умолчанию, единственное что установлено:
1. Изменение оригинального размера кадра, если оригинальный больше.
2. Оригинальная звуковая дорожка, если сжатие одно и тоже.
3. Что бы файлы ts проигрывались без транскодирования, установил им DLNA тип вместо: AVC_TS_HD_24_AC3 поставил: MPEG_TS_SD_EU_ISO

В результате у меня проигрывается 95% файлов, при чем изображение растягивается на весь экран, работает перемотка и переключаются звуковые дорожки.
Sony KDL-32W5500
Alexander Great
Posts: 99
Joined: Wed Mar 10, 2010 9:24 am

Re: Опыт настройки HMS и Sony W5500 + несколько вопросов

Post by Alexander Great »

Извините что встреваю.
Lamoboy wrote:1. Не перескакивает ли у Вас воспроизведение на следующий видеофайл в папке?
Это по-моему настройки телевизора. Options->Playback->Target->All clips
Lamoboy wrote:1. Изменение оригинального размера кадра, если оригинальный больше.
У меня стоит "Минимально, пропорционально размеру".
Lamoboy wrote:2. Оригинальная звуковая дорожка, если сжатие одно и тоже.
Аналогично.
Lamoboy wrote:В результате у меня проигрывается 95% файлов, при чем изображение растягивается на весь экран, работает перемотка и переключаются звуковые дорожки.
95% всех файлов? Или 95% ts файлов? Как могут переключаться дорожки, если при транскодировании они просто не добавляются в результирующий файл? Поясните пожалуйста.
Alex Commandor
Posts: 21
Joined: Sat Mar 13, 2010 2:22 pm

Re: Опыт настройки HMS и Sony W5500 + несколько вопросов

Post by Alex Commandor »

Lamoboy wrote:1. Не перескакивает ли у Вас воспроизведение на следующий видеофайл в папке? Дело в том, что у меня при использовании оперативки для транскодирования и установленной опции Chunked такое имеет место быть.
Не перескакивает. Вам, кстати, уже написАли, что это в настройках телевизора.
Lamoboy wrote:2. Вы не используете опцию изменение оригинального размера кадра ТОЛЬКО если оригинальный больше, т.е. никогда (мне еще не попадалось видео больше 1080p)? Мне нравится смотреть видео на весь экран, телевизор прекрасно справляется с масштабированием изображения сам.
А какая, собственно, будет кардинальная разница? Если изображения нестандартных разрешений, так их, как ни крути, а телек без транскодинга все-равно не скушает. Потом, если включена опция "Минимально, пропорционально экрану", то КАЖДЫЙ фильм дополняется сразу бордерами до пропорции 16:9, и на телике не надо постоянно щелкать кнопку подбора соотношения сторон кадра - это всегда будет широкоэкранный режим. Да и не уверен я, что телик справляется с масштабирование намного лучше компьтера ;) Вобщем, насчет этого пункта могу сказать одно: это дело вкуса.
Lamoboy wrote:3. Что бы файлы ts проигрывались без транскодирования, установил им DLNA тип вместо: AVC_TS_HD_24_AC3 поставил: MPEG_TS_SD_EU_ISO
А если внутри потока НЕ мпег2??? Как тогда будет проигрываться Ваш файл? Да и потом, у Соньки встроенная поддержка AVC(h264). С чего Вы взяли, что тип AVC_TS_HD_24_AC3 будет обязательно перекодироваться???
Lamoboy wrote:В результате у меня проигрывается 95% файлов, при чем изображение растягивается на весь экран, работает перемотка и переключаются звуковые дорожки.
Я, как и Alexander Great, сделаю квадратные глаза :shock: и тоже спрошу Вас: а какого типа файлы Вы смотрите через HMS??? Если у Вас все фильмы в формате m2ts (или подобные), так о чем Вы тогда говорите? Сонька такие файлы понимает БЕЗ транскодирования, и только поэтому для таких файлов нормально работает перемотка, нормально переключаются звуковые дорожки и т.п. Как только Вы скормите HMS-у фильм в mkv, так сразу и начнутся свистопляски, потому как кодек видео внутри матрешки может быть практически ЛЮБЫМ, да и к звуку это же относится. А как только HMS видит, что кодек не относится к поддерживаемым клиентским устройством, так сразу же и включается транскодирование. А ВСЕ профили, которые есть в HMS, транскодируют только ОДНУ видео и ОДНУ аудиодорожку. :( Вот поэтому мы тут периодически и фонтанируем бредовыми идеями :mrgreen: о переключении звука и соответствии размеров кадра. Ибо не очень-то хочется перекодировать все фильмы в m2ts, чтобы смотреть их без транскодинга. Это, во-первых, время, а во-вторых - место, ибо m2ts чаще всего будет бОльшего размера, чем mkv (даже без перекодирования, при обычном ремуксировании).
Вот.
HMS 1.21.2 + Sony KDL32W5500, Win7 x64 Ultimate, Core2Duo E8500 3.16GHz, 8GB RAM, ATI Radeon 4870HD 512MB + NVIDIA GeForce GT 440 1GB (hybrid PhysX)
Lamoboy
Posts: 45
Joined: Wed Dec 30, 2009 11:38 am
Location: Киев
Contact:

Re: Опыт настройки HMS и Sony W5500 + несколько вопросов

Post by Lamoboy »

Alexander Great wrote:Это по-моему настройки телевизора. Options->Playback->Target->All clips
Я имел ввиду переход к воспроизведению следующего видеофайла, по среди воспроизведения текущего. Такое у меня происходило, когда я включал в настройках HMS использование оперативной памяти для транскодирования. Такое впечатление, что когда заканчивается оперативка, HMS прерывает передачу текущего файла и переходит к следующему.
Alexander Great wrote:У меня стоит "Минимально, пропорционально размеру".
т.е. у Вас картинка с полями по краям?
Alexander Great wrote:95% всех файлов? Или 95% ts файлов? Как могут переключаться дорожки, если при транскодировании они просто не добавляются в результирующий файл? Поясните пожалуйста.
действительно, похоже что дорожки переключаются только у тех файлов, что идут без транскоридования, ts, m2ts, vob и т.д.
Sony KDL-32W5500
Alexander Great
Posts: 99
Joined: Wed Mar 10, 2010 9:24 am

Re: Опыт настройки HMS и Sony W5500 + несколько вопросов

Post by Alexander Great »

Lamoboy wrote:Я имел ввиду переход к воспроизведению следующего видеофайла, по среди воспроизведения текущего.
Никогда такого не было. :? Буфер стоит 128 мег.
Lamoboy wrote:т.е. у Вас картинка с полями по краям?
Нет. У меня нормальная картинка. Если фильм узкий, кадр достраивается до 16х9 и черные поля сверху и снизу. Если фильм 3х4 то я просто включаю режим "Zoom", чтобы не было полей по краям, верх и низ обрубаются телевизором.

Был какой-то дикий фильм с разрешением 1180х720, там да, были узкие поля слева и справа. Но мне такой только 1 попадался.
Post Reply