




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

Вот

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