HMSMPEG
hmsmpeg.exe
http://www.ffmpeg.org/
HmsMPEG
Hmsmpeg.exe
http://www.ffmpeg.org/
hmsMPEG
hmsmpeg.exe
http://www.ffmpeg.org/
HMSMPEG
PascalScript
Профиль транскодирования использует таблицу поддерживаемых форматов из настроек устройства
Транскодирование без перекодирования видео
3
begin
if SameText(cfgTranscodingFileFormat, 'MPEG (DVD)') then
FileExt := 'mpg'
else if Pos('MPEGTS', cfgTranscodingFileFormat) > 0 then
FileExt := 'ts'
else if Pos('ASF', cfgTranscodingFileFormat) > 0 then
FileExt := 'wmv'
else if SameText(cfgTranscodingFileFormat, 'MP4') then
FileExt := 'mp4'
else if SameText(cfgTranscodingFileFormat, 'MPEG1') then
FileExt := 'mpeg'
else if SameText(cfgTranscodingFileFormat, 'FLV') then
FileExt := 'flv'
else
FileExt := '';
if FileExt <> '' then
MimeType := HmsGetMimeType(FileExt)
else
MimeType := ''
end.
PascalScript
1
const
csFFMpegVideoParams = ' -vcodec %s %s%s -pix_fmt yuv420p';
csFFMpegAudioParams = ' -acodec %s -ab %d -ar %d -ac %d';
procedure GetAudioTranscodingParams(const aAudioCodec: string;
var aCodecName, aFileFormat: string; var aCodecID, aAudioBitrate, aAudioChannels: Integer);
begin
aAudioBitrate := cfgTranscodingAudioBitrate;
if (cfgTranscodingAudioChannels <> 0) then
aAudioChannels := cfgTranscodingAudioChannels;
if SameText(aAudioCodec, 'AAC') then begin
aCodecName := 'libfaac';
aFileFormat := 'adts';
aCodecID := CODEC_ID_AAC;
end else if SameText(aAudioCodec, 'MP3') then begin
aCodecName := 'libmp3lame';
aFileFormat := 'mp3';
aCodecID := CODEC_ID_MP3;
if aAudioBitrate > 320000 then
aAudioBitrate := 320000;
if aAudioChannels > 2 then
aAudioChannels := 2;
end else if SameText(aAudioCodec, 'MP2') then begin
aCodecName := 'mp2';
aFileFormat := 'mp2';
aCodecID := CODEC_ID_MP2;
if aAudioBitrate > 320000 then
aAudioBitrate := 320000;
if aAudioChannels > 2 then
aAudioChannels := 2;
end else if SameText(aAudioCodec, 'LPCM') then begin
aCodecName := 'pcm_s16be';
aFileFormat := 's16be';
aCodecID := CODEC_ID_PCM_BLURAY;
end else if SameText(aAudioCodec, 'DTS') then begin
aCodecName := 'dca';
aFileFormat := 'dts';
aCodecID := CODEC_ID_DTS;
aAudioChannels := 0
end else if SameText(aAudioCodec, 'WMA') then begin
aCodecName := 'wmav2';
aFileFormat := 'asf';
aCodecID := CODEC_ID_WMAV2;
if aAudioChannels > 2 then
aAudioChannels := 2;
end else begin
aCodecName := 'ac3';
aFileFormat := 'ac3';
if SameText(aAudioCodec, 'AC3') then
aCodecID := CODEC_ID_AC3
else
aCodecID := CODEC_ID_NONE;
end
end;
function GetFileFormat(const aFileFormat: string): string;
begin
if (aFileFormat = '') or SameText(aFileFormat, 'MPEG (DVD)') then
Result := 'dvd'
else if Pos('MPEGTS', aFileFormat) > 0 then
Result := 'mpegts'
else if Pos('ASF', aFileFormat) > 0 then
Result := 'asf'
else if SameText(aFileFormat, 'MP4') then
Result := 'ipod'
else if SameText(aFileFormat, 'FLV') then
Result := 'flv'
else if SameText(aFileFormat, 'MPEG1') then
Result := 'mpeg'
else
Result := aFileFormat
end;
function GetVideoCodec(const aVideoCodec: string): string;
begin
if (aVideoCodec = '') or SameText(aVideoCodec, 'MPEG2') then
Result := 'mpeg2video'
else if SameText(aVideoCodec, 'MPEG1') then
Result := 'mpeg1video'
else if SameText(aVideoCodec, 'FLV') then
Result := 'flv'
else if SameText(aVideoCodec, 'WMV') then
Result := 'wmv2'
else if SameText(aVideoCodec, 'MPEG4') then
Result := 'mpeg4'
else if SameText(aVideoCodec, 'X264') then
Result := 'libx264 -x264opts "fast-pskip=1:rc-lookahead=0:aq_mode=0" -partitions none -sc_threshold 0 -trellis 0 -me_method dia -refs 1 -subq 0 -vprofile baseline -level 30 -bufsize 10000000 '
else
Result := aVideoCodec
end;
function GetMultiThreadSupported(const aVideoCodec: string): Boolean;
begin
Result := not MatchText(aVideoCodec, ['WMV', 'MPEG1', 'FLV'])
end;
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 GetAudioSampleRate(const aFileFormat, aAudioCodec: string): Integer;
begin
if MatchText(aFileFormat, ['FLV']) and not SameText(aAudioCodec, 'AAC') then
Result := 44100
else
Result := 48000
end;
function GetAudioChannels(const aAudioCodec: string; aConfigAudioChannels, aStreamAudioChannels: Integer): Integer;
begin
if aConfigAudioChannels > 0 then
Result := aConfigAudioChannels
else
Result := aStreamAudioChannels;
if (Result > 2) and MatchText(aAudioCodec, ['MP2', 'MP3']) then
Result := 2
else if (Result = 1) and MatchText(aAudioCodec, ['AAC', 'AC3']) then
Result := 2
else if Result > 6 then
Result := 6
end;
function VideoCodecCompatible(const aFileFormat: string): Boolean;
begin
Result := HmsIsFormatSupported(aFileFormat, 'copy', '');
end;
function AudioCodecCompatible(const aFileFormat: string): Boolean;
begin
Result := HmsIsFormatSupported(aFileFormat, '', 'copy')
end;
function IsPipe(const aFileName: string): Boolean;
begin
Result := Pos('\\.\pipe\', aFileName) > 0;
end;
procedure AddFilterParams(var aFilterParams: string; const aAddParams: string);
begin
if aFilterParams <> '' then
aFilterParams := aFilterParams + ',';
aFilterParams := aFilterParams + aAddParams
end;
var
bMapStreams, bDeinterlace, bh264_mp4toannexb, bPipe, bSuccess, bAudioTranscoding, bVideoTranscoding: Boolean;
iAudioBitrate, iAudioChannels, iAudioCfgBitrate, iAudioCfgCodecID, iAudioStreamNo,
iFrameWidth, iFrameHeight, iWidth, iHeight, iPadLeft, iPadTop, iPadRight, iPadBottom: Integer;
sVideoTranscodingParams, sAudioTranscodingParams, sTranscodingFileFormat, sTranscodingParams,
sAudioCfgCodecName, sAudioCfgFileFormat, sInputAudioFileName, sFilterParams, sPadParams,
sInputVideoFileName, sFrameRate, sResourcePipe, sVideoBitrate, sVideoMinMaxRate: string;
begin
if HmsGetStreamCount = 0 then
HmsRetrieveProperties;
bPipe := IsPipe(InputFileName);
bDeinterlace := SameText(HmsGetVideoSettings(vstDeinterlace), 'on');
if bPipe then
else if (mpIsoItem or mpDvdItem or mpBdItem) and HmsCreateResourcePipe(sResourcePipe) then begin
InputFileName := sResourcePipe;
bPipe := True
end else if mpPodcastItem then begin
InputFileName := HmsGetItemProperty(mpiMediaResourceSource);
bPipe := IsPipe(InputFileName);
end;
bVideoTranscoding := False;
bAudioTranscoding := False;
sInputVideoFileName := InputFileName;
sInputAudioFileName := InputFileName;
iAudioStreamNo := mpAudioStreamNo;
if iAudioStreamNo < 0 then
iAudioStreamNo := 0;
iAudioChannels := HmsGetStreamChannels(iAudioStreamNo);
if iAudioChannels < 2 then iAudioChannels := 2;
iAudioBitrate := HmsGetStreamBitrate(stAudio, iAudioStreamNo);
sTranscodingParams := '';
sTranscodingFileFormat := GetFileFormat(cfgTranscodingFileFormat);
bVideoTranscoding := False;
bAudioTranscoding := False;
if SameText(HmsGetVideoSettings(vstVideoOriginal), 'On') then
bVideoTranscoding := False
else if SameText(HmsGetVideoSettings(vstVideoOriginal), 'Off') then
bVideoTranscoding := True
else if (mpSubtitleLanguage <> '') or (HmsGetVideoSettings(vstSubtitle) <> '') or bDeinterlace then
bVideoTranscoding := True
else if (mpFrameRate > 0) and (mpFrameRate < 20) then
bVideoTranscoding := True
else if not VideoCodecCompatible(sTranscodingFileFormat) then
bVideoTranscoding := True
else begin
if (mpOriginalWidth > 0) then begin
iWidth := mpOriginalWidth;
iHeight := mpOriginalHeight;
end else begin
iWidth := mpWidth;
iHeight := mpHeight;
end;
if (iWidth > cfgMaximumVideoResolutionWidth) or (iHeight > cfgMaximumVideoResolutionHeight) then
bVideoTranscoding := True
end;
GetAudioTranscodingParams(cfgTranscodingAudioCodec, sAudioCfgCodecName,
sAudioCfgFileFormat, iAudioCfgCodecID, iAudioCfgBitrate, iAudioChannels);
if SameText(HmsGetVideoSettings(vstAudioOriginal), 'On') then
bAudioTranscoding := False
else if SameText(HmsGetVideoSettings(vstAudioOriginal), 'Off') then
bAudioTranscoding := True
else
bAudioTranscoding := not AudioCodecCompatible(sTranscodingFileFormat);
if bVideoTranscoding then begin
sVideoMinMaxRate := '';
if cfgTranscodingVideoBitrate > 0 then begin
sVideoBitrate := '-b:v ' + IntToStr(cfgTranscodingVideoBitrate);
if cfgTranscodingVideoMinMaxRate then
sVideoMinMaxRate := Format(' -minrate %d -maxrate %d -bufsize %d',
[cfgTranscodingVideoBitrate, cfgTranscodingVideoBitrate,
HmsTranscodingBufferSize(cfgTranscodingVideoBitrate)])
end else
sVideoBitrate := '-q:v 0';
sVideoTranscodingParams := Format(csFFMPegVideoParams,
[GetVideoCodec(cfgTranscodingVideoCodec), sVideoBitrate, sVideoMinMaxRate]);
sFrameRate := HmsGetVideoSettings(vstFrameRate);
if sFrameRate = '' then
sFrameRate := cfgTranscodingFrameRate;
if sFrameRate = '' then begin
if SameText(cfgTranscodingVideoCodec, 'FLV') then
sFrameRate := FormatFloat('0', mpFrameRate)
else if (mpFrameRate > 0) and (mpFrameRate < 20) then
sFrameRate := '23.976'
end;
if sFrameRate <> '' then
sVideoTranscodingParams := sVideoTranscodingParams + ' -r ' + sFrameRate;
iWidth := mpWidth; iHeight := mpHeight;
if (iWidth > 0) and (iHeight > 0) then begin
sFilterParams := ''; sPadParams := '';
if HmsTranscodingFrameParams(iWidth, iHeight, cfgTranscodingScreenFormat,
iPadLeft, iPadTop, iPadRight, iPadBottom) then begin
if mp3DVideoType in [1, 2] then begin
iWidth := iWidth + iPadLeft + iPadRight;
iHeight := iHeight + iPadTop + iPadBottom;
if mp3DVideoType = 1 then
iWidth := (iWidth div 4) * 4
else
iHeight := (iHeight div 4) * 4
end;
iFrameWidth := iWidth;
iFrameHeight := iHeight;
if (mp3DVideoType = 0) and ((iPadLeft > 0) or (iPadRight > 0) or (iPadTop > 0) or (iPadBottom > 0)) then begin
Inc(iFrameWidth, iPadLeft + iPadRight);
Inc(iFrameHeight, iPadTop + iPadBottom);
sPadParams := Format('pad=%d:%d:%d:%d:0x%s',
[iFrameWidth, iFrameHeight, iPadLeft, iPadTop, HmsConvertColor(cfgTranscodingPadColor)]);
if cfgTranscodingFrameExists then
sVideoTranscodingParams := sVideoTranscodingParams + cfgTranscodingFrameParams;
end
end else begin
iFrameWidth := iWidth;
iFrameHeight := iHeight;
end;
AddFilterParams(sFilterParams, Format('scale=%d:%d', [iWidth, iHeight]));
if sPadParams <> '' then AddFilterParams(sFilterParams, sPadParams);
AddFilterParams(sFilterParams, 'setdar=' + cfgTranscodingAspectRatio);
sVideoTranscodingParams := sVideoTranscodingParams + Format(' -vf "%s"', [sFilterParams]);
sVideoTranscodingParams := sVideoTranscodingParams + HmsTranscodingSubTitleParams(
iFrameWidth, iFrameHeight, iWidth, iHeight, iPadLeft, iPadTop);
if (cfgTranscodingThreadCount > 1) and GetMultiThreadSupported(cfgTranscodingVideoCodec) then
sVideoTranscodingParams := sVideoTranscodingParams + ' -threads ' + IntToStr(cfgTranscodingThreadCount);
end
end else begin
sVideoTranscodingParams := ' -copyinkf -vcodec copy ';
if SameText(mpVideoCodec, 'H264') then begin
if VarToStr(mpCodecNalLengthSize) <> '' then
bh264_mp4toannexb := VarToStr(mpCodecNalLengthSize) <> '0'
else
bh264_mp4toannexb := not MatchText(mpFileType, ['mpegts', 'wtv', 'hls', 'applehttp'], True);
if bh264_mp4toannexb then
sVideoTranscodingParams := sVideoTranscodingParams + ' -vbsf h264_mp4toannexb'
end
end;
if bAudioTranscoding then
sAudioTranscodingParams := Format(csFFMpegAudioParams, [sAudioCfgCodecName, iAudioCfgBitrate,
GetAudioSampleRate(cfgTranscodingFileFormat, cfgTranscodingAudioCodec), iAudioChannels])
else
sAudioTranscodingParams := ' -acodec copy';
bMapStreams := HmsGetStreamCount > 0;
sTranscodingParams := HmsTranscodingProbeParams;
if mpTimeStart <> '' then
sTranscodingParams := sTranscodingParams + '-ss ' + mpTimeStart + ' ';
if SameText(mpFileType, 'mpeg') then
sTranscodingParams := sTranscodingParams + '-f mpeg ';
if (InputFileName <> '') and (InputFileName[1] = '-') then
sTranscodingParams := sTranscodingParams + InputFileName + ' '
else
sTranscodingParams := sTranscodingParams + Format('-i "%s" ', [InputFileName]);
sTranscodingParams := sTranscodingParams + '-f ' + GetFileFormat(cfgTranscodingFileFormat);
sTranscodingParams := sTranscodingParams + sVideoTranscodingParams + sAudioTranscodingParams;
if bMapStreams then
sTranscodingParams := sTranscodingParams + Format(' -map 0:%d -map 0:%d', [HmsGetStreamIndex(stVideo, 0), HmsGetStreamIndex(stAudio, iAudioStreamNo)]);
sTranscodingParams := sTranscodingParams + ' "<OUTPUT FILE>"';
// < By WendyH ----------------------------------------------------------------
// Удаляем из параметров вообще ключ форматирования видео (scale, dar...)
if HmsRegExMatch('(-vf\s+".*?")', sTranscodingParams, gsUserVariable1) then sTranscodingParams := ReplaceStr(sTranscodingParams, gsUserVariable1, '');
// > By WendyH ----------------------------------------------------------------
TranscodingResult := HmsTranscodingExecute('HMSMPEG', sTranscodingParams, True, InputFileName, OutputFileName)
end.
PascalScript
Фильмы (Оптимальный) Без изменения соотношения сторон
-1
8
3d9630ea-8688-48ea-ab53-c202f108d198