 Оказалось, что тсМуксер при задании стартовой позиции файла начинает муксирование НЕ с этой позиции (
 Оказалось, что тсМуксер при задании стартовой позиции файла начинает муксирование НЕ с этой позиции (  ), а как бы "перематывает" файл с самого начала, и только по достижении нужного времени начинает муксирование
 ), а как бы "перематывает" файл с самого начала, и только по достижении нужного времени начинает муксирование   Бред. В работе это выливается в то, что надо ставить значение "Прекращение транскодирования, если временный файл не используется" в 30 секунд (почему не больше - чуть дальше), дабы телику хватало времени дождаться начала потока
 Бред. В работе это выливается в то, что надо ставить значение "Прекращение транскодирования, если временный файл не используется" в 30 секунд (почему не больше - чуть дальше), дабы телику хватало времени дождаться начала потока   Но и это еще не всё. При переходе на позицию, добраться до которой тсМуксеру надо более 30 секунд, добраться до нее не получается вообще - срабатывает, я так понимаю, таймаут телевизора (30 сек), ибо он пишет вместо "Воспроизведение невозможно" другую ошибку: "Не удается получить доступ к серверу"
 Но и это еще не всё. При переходе на позицию, добраться до которой тсМуксеру надо более 30 секунд, добраться до нее не получается вообще - срабатывает, я так понимаю, таймаут телевизора (30 сек), ибо он пишет вместо "Воспроизведение невозможно" другую ошибку: "Не удается получить доступ к серверу"   
 
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 Хочу обратиться к автору этой без преувеличения замечательнейшей программы с просьбой: помогите нам в создании профиля, который генерит НОРМАЛЬНЫЙ m2ts-файл (либо ts-поток) со всеми звуковыми дорожками и с разрешениями либо 1280х720, либо 1920х1080. В идеале, думаю, было бы классно, если бы БЕЗ транскодинга в поток передавались только форматы видео AVC(H264) и MPEG1/2, а аудио - AC3 и MP3. Но мне так кажется, что можно даже ВСЁ транскодировать на лету в MPEG2 и AC3 (6 каналов), лишь бы телик всё понимал и нормально перематывал.
 Хочу обратиться к автору этой без преувеличения замечательнейшей программы с просьбой: помогите нам в создании профиля, который генерит НОРМАЛЬНЫЙ m2ts-файл (либо ts-поток) со всеми звуковыми дорожками и с разрешениями либо 1280х720, либо 1920х1080. В идеале, думаю, было бы классно, если бы БЕЗ транскодинга в поток передавались только форматы видео AVC(H264) и MPEG1/2, а аудио - AC3 и MP3. Но мне так кажется, что можно даже ВСЁ транскодировать на лету в MPEG2 и AC3 (6 каналов), лишь бы телик всё понимал и нормально перематывал.Вот

З.Ы. Размеры нашей благодарности будут безграничны в пределах разумного



 
  Привожу скрипт:
 Привожу скрипт:
 При запуске профиля тсМуксер практически сразу же отключается от пайпа - такое впечатление, что он считывает столько данных, сколько успевает передать ффмпег, и на этом всё заканчивается. Это подтверждается тем, что при наличии многих аудиодорожек тсМуксер вообще ничего не успевает смуксить. Я даже из-за этого попытался там вставить цикл ожидания начала запуска тсМуксера в зависимости от количества звуковых дорог, - всё равно бестолку
 При запуске профиля тсМуксер практически сразу же отключается от пайпа - такое впечатление, что он считывает столько данных, сколько успевает передать ффмпег, и на этом всё заканчивается. Это подтверждается тем, что при наличии многих аудиодорожек тсМуксер вообще ничего не успевает смуксить. Я даже из-за этого попытался там вставить цикл ожидания начала запуска тсМуксера в зависимости от количества звуковых дорог, - всё равно бестолку  