<?xml version="1.0" encoding="utf-8"?>
<HmsTranscodingConfig version="2.01">
  <TranscoderList>
    <Transcoder>
      <Name>TSMUXER</Name>
      <Path>C:\Program Files (x86)\Home Media Server\Transcoders\tsmuxer.exe</Path>
      <HomePage>http://www.smlabs.net/tsmuxer.html</HomePage>
      <Download>http://www.smlabs.net/tsmuxer.html</Download>
    </Transcoder>
  </TranscoderList>
  <TranscodingProfileList>
    <Profile>
      <TranscoderName>TSMUXER</TranscoderName>
      <TranscodingCondition>begin
  if Pos(&apos;MPEGTS&apos;, cfgTranscodingFileFormat) &gt; 0 then 
    OutputFileName := ChangeFileExt(OutputFileName, &apos;.ts&apos;)        
  else                                                            
    OutputFileName := ChangeFileExt(OutputFileName, &apos;.m2ts&apos;);
  TranscodingCondition := True  
end.</TranscodingCondition>
      <TranscodingConditionSyntaxType>PascalScript</TranscodingConditionSyntaxType>
      <TranscodingComment></TranscodingComment>
      <TranscodingFolder>Транскодирование без перекодирования видео</TranscodingFolder>
      <TranscodingMediaType>3</TranscodingMediaType>
      <TranscodingMimeType></TranscodingMimeType>
      <TranscodingMimeTypeScript>MimeType := HmsGetMimeType(&apos;m2ts&apos;)</TranscodingMimeTypeScript>
      <TranscodingMimeTypeSyntaxType>PascalScript</TranscodingMimeTypeSyntaxType>
      <TranscodingMode>1</TranscodingMode>
      <TranscodingParams>const
  csAudioTranscodingParams = &apos; -acodec %s -ar %d -ab %d -ac %d&apos;;
  
function GetCodecInfo(aCodecID: Integer): string;
begin
  if aCodecID = CODEC_ID_AC3 then  
    Result := &apos;A_AC3&apos; 
  else if aCodecID = CODEC_ID_AAC then
    Result := &apos;A_AAC&apos;    
  else if aCodecID = CODEC_ID_MP3 then  
    Result := &apos;A_MP3&apos;
  else if aCodecID = CODEC_ID_MP2 then  
    Result := &apos;A_MP3&apos;
  else if aCodecID = CODEC_ID_DTS then  
    Result := &apos;A_DTS&apos;
  else if aCodecID = CODEC_ID_PCM_BLURAY then  
    Result := &apos;A_LPCM&apos;    
  else  
    Result := &apos;A_DTS&apos;
end;    

procedure GetAudioTranscodingParams(const aAudioCodec: string; 
    var aCodecName, aFileFormat: string; var aCodecID, aAudioBitrate, aAudioChannels: Integer);
begin
  aAudioBitrate := cfgTranscodingAudioBitrate;
  if SameText(aAudioCodec, &apos;AAC&apos;) then begin
    aCodecName  := &apos;libfaac&apos;;    
    aFileFormat := &apos;adts&apos;;
    aCodecID    := CODEC_ID_AAC; 
  end else if SameText(aAudioCodec, &apos;MP3&apos;) then begin
    aCodecName  := &apos;libmp3lame&apos;;    
    aFileFormat := &apos;mp3&apos;;
    aCodecID    := CODEC_ID_MP3;
    if aAudioBitrate &gt; 320000 then
      aAudioBitrate := 320000;
    if aAudioChannels &gt; 2 then
      aAudioChannels := 6;      
  end else if SameText(aAudioCodec, &apos;MP2&apos;) then begin  
    aCodecName  := &apos;mp2&apos;;    
    aFileFormat := &apos;mp2&apos;;
    aCodecID    := CODEC_ID_MP2;
    if aAudioBitrate &gt; 320000 then
      aAudioBitrate := 320000;      
    if aAudioChannels &gt; 2 then
      aAudioChannels := 6;      
  end else if SameText(aAudioCodec, &apos;LPCM&apos;) then begin  
    aCodecName  := &apos;pcm_s16be&apos;;    
    aFileFormat := &apos;s16be&apos;;
    aCodecID    := CODEC_ID_PCM_BLURAY;
  end else if SameText(aAudioCodec, &apos;DCA&apos;) or SameText(aAudioCodec, &apos;DTS&apos;) then begin  
    aCodecName  := &apos;dca&apos;;    
    aFileFormat := &apos;dts&apos;;
    aCodecID    := CODEC_ID_DTS;
  end else begin
    aCodecName  := &apos;ac3&apos;;    
    aFileFormat := &apos;ac3&apos;;    
    if SameText(aAudioCodec, &apos;AC3&apos;) then
      aCodecID := CODEC_ID_AC3
    else                          
      aCodecID := CODEC_ID_NONE;
  end
end;

function GetVideoFormat(aCodecID: Integer): string;
var
  bh264_mp4toannexb: Boolean;
begin
  if aCodecID = CODEC_ID_H264 then begin 
    Result := &apos;h264&apos;;
    if VarToStr(mpCodecNalLengthSize) &lt;&gt; &apos;&apos; then      
      bh264_mp4toannexb := VarToStr(mpCodecNalLengthSize) &lt;&gt; &apos;0&apos;        
    else                         
      bh264_mp4toannexb := not MatchText(mpFileType, [&apos;mpegts&apos;, &apos;wtv&apos;, &apos;hls&apos;, &apos;applehttp&apos;], True);        
    if bh264_mp4toannexb then
      Result := Result + &apos; -vbsf h264_mp4toannexb&apos;
  end else if aCodecID = CODEC_ID_MPEG2VIDEO then  
    Result := &apos;mpeg2video&apos;    
  else   
    Result := &apos;&apos;
end;

var
  bAudioTranscoding, bCreateLPCM, bDeinterlace, bFileUnsupported, bHideDTS, 
  bPipe, bMapStreams, bSuccess, bVideoTranscoding: Boolean;
  i, iAudioBitrate, iAudioChannels, iAudioStreamNo, iAudioCodecID, iVideoCodecID,  
  iAudioCfgBitrate, iAudioCfgCodecID, iAudioDelay, iAudioSampleRate, 
  iAudioStreamID, iVideoStreamID: Integer;
  MetaFileLines: TStringList;
  sAudioInfo, sVideoInfo, sMetaFileName, sInputVideoFileName, sInputAudioFileName,
  sAudioCfgCodecInfo, sAudioCfgCodecName, sAudioCfgFileFormat, sResourcePipe,  
  sAudioTranscodingParams, sReadAudioPipeName, sWriteAudioPipeName, sFrameRate, 
  sChannelOrder, sSoxReadPipeName, sSoxWritePipeName, sSoxTranscodingParams, 
  sReadLpcmPipeName, sWriteLpcmPipeName, sReadVideoPipeName, sWriteVideoPipeName, 
  sTimeShift, sTranscodingAudioCodec, sTranscodingParams, 
  sVideoTranscodingParams: string; 
begin
  MetaFileLines := TStringList.Create;
  try                                 
    bSuccess   := True;    
    if HmsGetStreamCount = 0 then  
      HmsRetrieveProperties;
    bPipe := Pos(&apos;\\.\pipe\&apos;, InputFileName) &gt; 0;    
    bDeinterlace := SameText(HmsGetVideoSettings(vstDeinterlace), &apos;on&apos;);                                
    if bPipe then                 
      bFileUnsupported := True      
    else if (mpIsoItem or mpDvdItem or mpBdItem) and HmsCreateResourcePipe(sResourcePipe) then begin
      InputFileName := sResourcePipe;      
      bFileUnsupported := True; bPipe := True;      
    end else if mpPodcastItem then begin
      InputFileName := HmsGetItemProperty(mpiMediaResourceSource);      
      bFileUnsupported := True; bPipe := Pos(&apos;\\.\pipe\&apos;, InputFileName) &gt; 0;
    end else      
      bFileUnsupported := not MatchText(mpFileType, [&apos;mov,mp4,m4a,3gp,3g2,mj2&apos;,
             &apos;mpegts&apos;, &apos;mpeg&apos;, &apos;mp4&apos;, &apos;mov&apos;]) or (mpTimeStart &lt;&gt; &apos;&apos;);             
    bVideoTranscoding := False;      
    bAudioTranscoding := True;    
    bHideDTS    := False;    
    bCreateLPCM := False;
    sTimeShift := HmsGetVideoSettings(vstAudioDelay);
    if sTimeShift &lt;&gt; &apos;&apos; then
      sTimeShift := Format(&apos;, timeshift=%ss&apos;, [sTimeShift]);
    sInputVideoFileName := InputFileName;
    sInputAudioFileName := InputFileName;
    MetaFileLines.Add(&apos;MUXOPT --no-pcr-on-video-pid --vbr --vbv-len=1500&apos;);
    iAudioStreamNo := mpAudioStreamNo;
    if iAudioStreamNo &lt; 0 then
      iAudioStreamNo := 0;
    if (sTimeShift = &apos;&apos;) and (mpTimeStart = &apos;&apos;) then begin
      iAudioDelay := HmsGetStreamDelay(stAudio, iAudioStreamNo);      
      if iAudioDelay &lt;&gt; 0 then      
        sTimeShift := Format(&apos;, timeshift=%dms&apos;, [iAudioDelay]);
    end;        
    iVideoCodecID  := HmsGetStreamCodecID(stVideo, 0);  
    iAudioCodecID  := HmsGetStreamCodecID(stAudio, iAudioStreamNo);      
    iAudioChannels := HmsGetStreamChannels(iAudioStreamNo);    
    if iAudioChannels = 0 then iAudioChannels := 2;  
    iAudioBitrate  := HmsGetStreamBitrate(stAudio, iAudioStreamNo);
    if SameText(HmsGetVideoSettings(vstVideoOriginal), &apos;On&apos;) then    
      bVideoTranscoding := False                                       
    else if SameText(HmsGetVideoSettings(vstVideoOriginal), &apos;Off&apos;) then    
      bVideoTranscoding := True
    else begin
      bVideoTranscoding := (mpSubtitleLanguage &lt;&gt; &apos;&apos;) or (HmsGetVideoSettings(vstSubtitle) &lt;&gt; &apos;&apos;) or 
                            bDeinterlace;
      if not bVideoTranscoding and (mpFrameRate &gt; 0) and (mpFrameRate &lt; 20) then
        bVideoTranscoding := True;
    end;      
    sTranscodingParams := &apos;&apos;; sSoxTranscodingParams := &apos;&apos;;    
    if not bVideoTranscoding then begin 
      if SameText(mpVideoCodec, &apos;H264&apos;) then      
        iVideoCodecID := CODEC_ID_H264                        
      else if SameText(mpVideoCodec, &apos;MPEG2VIDEO&apos;) then
        iVideoCodecID := CODEC_ID_MPEG2VIDEO;    
      if iVideoCodecID = CODEC_ID_H264 then 
        sVideoInfo := &apos;V_MPEG4/ISO/AVC, "%s", level=4.1, insertSEI, contSPS&apos;
      else if iVideoCodecID = CODEC_ID_MPEG2VIDEO then
        sVideoInfo := &apos;V_MPEG-2, "%s"&apos;
      else if ((iVideoCodecID = CODEC_ID_VC1) or SameText(mpVideoCodec, &apos;VC1&apos;)) and not bFileUnsupported then
        sVideoInfo := &apos;V_MS/VFW/WVC1, "%s"&apos;
      else
        bVideoTranscoding := True 
    end;
    if bVideoTranscoding then begin   
      if SameText(cfgTranscodingVideoCodec, &apos;X264&apos;) then begin
        iVideoCodecID := CODEC_ID_H264;
        sVideoInfo := &apos;V_MPEG4/ISO/AVC, "%s", level=4.1, insertSEI, contSPS&apos;
      end else begin 
        iVideoCodecID := CODEC_ID_MPEG2VIDEO;
        sVideoInfo := &apos;V_MPEG-2, "%s"&apos;;        
      end
    end;                                 
    if (iAudioCodecID = CODEC_ID_DTS) and cfgTranscodingHideDTSInLPCM and 
       ((iAudioBitrate = 768000) or (iAudioBitrate = 1536000)) then begin                   
      bHideDTS := True;                  
      sAudioCfgFileFormat := &apos;dts&apos;;      
      sAudioInfo := &apos;A_LPCM&apos;
    end else begin    
      if SameText(HmsGetVideoSettings(vstAudioOriginal), &apos;On&apos;) then begin      
        bAudioTranscoding := True;        
        GetAudioTranscodingParams(mpAudioCodec, sAudioCfgCodecName,
              sAudioCfgFileFormat, iAudioCfgCodecID, iAudioCfgBitrate, iAudioChannels);
      end else begin
        GetAudioTranscodingParams(cfgTranscodingAudioCodec, sAudioCfgCodecName,
              sAudioCfgFileFormat, iAudioCfgCodecID, iAudioCfgBitrate, iAudioChannels);                     
        bAudioTranscoding := (iAudioCodecID &lt;&gt; iAudioCfgCodecID);
      end;
      if bAudioTranscoding then
        sAudioInfo := GetCodecInfo(iAudioCfgCodecID)
      else      
        sAudioInfo := GetCodecInfo(iAudioCodecID);
    end;
    if SameText(ExtractFileExt(mpFilePath), &apos;.mkv&apos;) then begin          
      iVideoStreamID := HmsGetStreamIndex(stVideo, 0) + 1;
      iAudioStreamID := HmsGetStreamIndex(stAudio, iAudioStreamNo) + 1;
    end else begin                         
      iVideoStreamID := HmsGetStreamID(stVideo, 0);  
      iAudioStreamID := HmsGetStreamID(stAudio, iAudioStreamNo);
      if SameText(mpFileType, &apos;mpeg&apos;) then begin            
        iVideoStreamID := iVideoStreamID and 255;
        iAudioStreamID := iAudioStreamID and 255;
      end
    end;                                                     
    if bVideoTranscoding or bAudioTranscoding or bHideDTS or bFileUnsupported then begin
      bMapStreams := HmsGetStreamCount &gt; 0;      
      if bVideoTranscoding or bFileUnsupported then
        bSuccess := HmsCreateDualPipe(sReadVideoPipeName, sWriteVideoPipeName, 10000000);      
      if bSuccess and (bAudioTranscoding or bFileUnsupported or bHideDTS) then                         
        bSuccess := HmsCreateDualPipe(sReadAudioPipeName, sWriteAudioPipeName, 10000000);        
      if bSuccess then begin
        if bVideoTranscoding then         
          sVideoTranscodingParams := HmsTranscodingVideoCodecParams
        else if bFileUnsupported then  
          sVideoTranscodingParams := &apos; -copyinkf -vcodec copy&apos;  //            
        else        
          sVideoTranscodingParams := &apos;&apos;;          
        if sVideoTranscodingParams &lt;&gt; &apos;&apos; then begin        
          if bMapStreams then                           
            sVideoTranscodingParams := sVideoTranscodingParams + Format(&apos; -map 0:%d&apos;, [HmsGetStreamIndex(stVideo, 0)]);
          sVideoTranscodingParams := sVideoTranscodingParams + Format(&apos; -f %s -y "%s"&apos;, [GetVideoFormat(iVideoCodecID), sWriteVideoPipeName]);
          sInputVideoFileName := sReadVideoPipeName;
          iVideoStreamID := 1;          
        end;  
        if bAudioTranscoding then begin 
          if cfgTranscodingAudioChannels &lt;&gt; 0 then          
            iAudioChannels := cfgTranscodingAudioChannels            
          else if iAudioChannels &lt; 2 then          
            iAudioChannels := 2;
          if (iAudioChannels = 6) and (mpAudioSampleRate &gt; 0) then          
            iAudioSampleRate := mpAudioSampleRate
          else              
            iAudioSampleRate := 48000;
          sAudioTranscodingParams := Format(csAudioTranscodingParams,          
               [sAudioCfgCodecName, iAudioSampleRate, iAudioCfgBitrate, iAudioChannels])
        end else if bFileUnsupported or bHideDTS then        
          sAudioTranscodingParams := &apos; -acodec copy &apos;
        else                                 
          sAudioTranscodingParams := &apos;&apos;;
        if sAudioTranscodingParams &lt;&gt; &apos;&apos; then begin
          if bMapStreams then                           
            sAudioTranscodingParams := sAudioTranscodingParams + Format(&apos; -map 0:%d&apos;, [HmsGetStreamIndex(stAudio, iAudioStreamNo)]);      
          sAudioTranscodingParams := sAudioTranscodingParams + Format(&apos; -f %s -y "%s"&apos;, [sAudioCfgFileFormat, sWriteAudioPipeName]);
          sInputAudioFileName := sReadAudioPipeName;          
          iAudioStreamID := 1;
        end;            
        if (sVideoTranscodingParams &lt;&gt; &apos;&apos;) or (sAudioTranscodingParams &lt;&gt; &apos;&apos;) then begin
           if (mpTimeStart &lt;&gt; &apos;&apos;) and not bPipe then
             sTranscodingParams := &apos;-ss &apos; + mpTimeStart + &apos; &apos;
           else
             sTranscodingParams := &apos;&apos;;                                   
           if SameText(mpFileType, &apos;mpeg&apos;) then                            
             sTranscodingParams := sTranscodingParams + &apos;-f mpeg &apos;;                                   
           sTranscodingParams := sTranscodingParams + Format(&apos;-i "%s"&apos;, [InputFileName]);
           if sVideoTranscodingParams = &apos;&apos; then
             sTranscodingParams := sTranscodingParams + &apos; -vn &apos; + sAudioTranscodingParams
           else if sAudioTranscodingParams = &apos;&apos; then                     
             sTranscodingParams := sTranscodingParams + &apos; -an &apos; + sVideoTranscodingParams
           else begin   
             if bVideoTranscoding and bAudioTranscoding and (mpTimeStart &lt;&gt; &apos;&apos;) and not bPipe then                                  
               sTranscodingParams := &apos;-async 1 &apos; + sTranscodingParams;
             sTranscodingParams := sTranscodingParams + sVideoTranscodingParams + sAudioTranscodingParams;                                   
           end;
           sTranscodingParams := sTranscodingParams + &apos; -v -1 -loglevel quiet&apos;                         
        end else        
          sTranscodingParams := &apos;&apos;;          
        if sTranscodingParams &lt;&gt; &apos;&apos; then begin        
          if SameText(sAudioInfo, &apos;A_LPCM&apos;) or bHideDTS then begin
            bSuccess := HmsCreateDualPipe(sReadLpcmPipeName, sWriteLpcmPipeName, 10000000);          
            if bSuccess then begin              
              if bHideDTS then begin
                iAudioChannels := 6;                        
                sAudioInfo := &apos;A_LPCM&apos;
              end else if iAudioChannels = 6 then begin
                sChannelOrder := &apos;1 2 3 5 6 4&apos;;                     
                if HmsCreateDualPipe(sSoxReadPipeName, sSoxWritePipeName) then begin                   
                  sSoxTranscodingParams := Format(&apos;-t raw -B -c %d -r 48000 -e signed -b 16 "%s" -t raw -B -c %d -r 48000 "%s" remix %s&apos;,
                            [iAudioChannels, sReadAudioPipeName, iAudioChannels, sSoxWritePipeName, sChannelOrder]);
                  sReadAudioPipeName := sSoxReadPipeName                      
                end
              end;           
              if bSuccess then begin
                HmsCreateLpcmFile(sReadAudioPipeName, sWriteLpcmPipeName, iAudioChannels, 48000, 16, False, bHideDTS);       
                sInputAudioFileName := sReadLpcmPipeName                    
              end
            end              
          end
        end   
      end
    end;
    if bSuccess then begin                                
      sFrameRate := HmsGetVideoSettings(vstFrameRate);
      if (sFrameRate = &apos;&apos;) and (mpFrameRate &gt; 0) then begin
        if mpFrameRate &lt; 23976 / 1000 then
          mpFrameRate := 23.976;
        sFrameRate := ReplaceStr(FormatFloat(&apos;0.000&apos;, mpFrameRate), &apos;,&apos;, &apos;.&apos;)
      end else                  
        sFrameRate := &apos;&apos;;
      if sFrameRate &lt;&gt; &apos;&apos; then
        sVideoInfo := sVideoInfo + &apos;, fps=&apos; + sFrameRate;                                                        
      sVideoInfo := sVideoInfo + &apos;, track=%d&apos;;
      sAudioInfo := sAudioInfo + &apos;, "%s", &apos; + &apos;track=%d&apos; + sTimeShift;
      MetaFileLines.Add(Format(sVideoInfo, [sInputVideoFileName, iVideoStreamID]));
      MetaFileLines.Add(Format(sAudioInfo, [sInputAudioFileName, iAudioStreamID]));
      sMetaFileName := ChangeFileExt(OutputFileName, &apos;.meta&apos;);
      MetaFileLines.SaveToFile(sMetaFileName);                      
      if Pos(&apos;MPEGTS&apos;, cfgTranscodingFileFormat) &gt; 0 then 
        OutputFileName := ChangeFileExt(OutputFileName, &apos;.ts&apos;)        
      else                                                            
        OutputFileName := ChangeFileExt(OutputFileName, &apos;.m2ts&apos;);
      if sSoxTranscodingParams &lt;&gt; &apos;&apos; then      
        HmsTranscodingExecute(&apos;SOX&apos;, sSoxTranscodingParams, False);
      if sTranscodingParams &lt;&gt; &apos;&apos; then         
        TranscodingResult := HmsTranscodingExecute(&apos;HMSMPEG&apos;, sTranscodingParams, False, InputFileName);        
      TranscodingResult := HmsTranscodingExecute(&apos;TSMUXER&apos;, &apos;"&apos; + sMetaFileName + &apos;" "&apos; + OutputFileName + &apos;"&apos;, True);
    end
  finally
    MetaFileLines.Free
  end
end.</TranscodingParams>
      <TranscodingParamsSyntaxType>PascalScript</TranscodingParamsSyntaxType>
      <TranscodingProfile>Фильмы - TsMuxer (5.1) (ci)</TranscodingProfile>
      <TranscodingProfileActive>-1</TranscodingProfileActive>
      <TranscodingProfilePriority>18</TranscodingProfilePriority>
      <TranscodingProfileUuid>31dade7f-5180-44d5-b08f-3d8ce43ad4f0</TranscodingProfileUuid>
    </Profile>
  </TranscodingProfileList>
</HmsTranscodingConfig>
