Total Movie Converter X是Web服务器的视频转换器
Windows
2000/2003/Vista
7/8/10/11
and
2012/2016/2019/2022 Server
and
Docker/Citrix/Wine
Total Movie Converter X 是一款服务器端 SDK,可转换 AVI、MP4、WMV、MPEG、MOV、FLV、MKV 以及 15 种以上其他视频格式 — 无需在服务器上安装外部编解码器包或媒体框架。它以无界面方式运行:无 GUI、无对话框、无弹窗。Total Movie Converter X 同时提供命令行二进制程序和 ActiveX/COM 接口,因此可直接集成到 ASP、PHP、.NET、Python、Ruby、Java 以及任何支持 COM 的后端中。完整的支持视频格式列表如下:
该程序实时处理视频。无需任何中间 AVI 或 MPEG 文件。
高速转换和批量转换让整个过程简单流畅、不令人乏味。免费试用(30 天试用期,无任何限制),亲自验证它真正物有所值。
当前支持的部分文件格式转换:
|
|
|
string src = @"C:\test\Source.avi";
string dest = @"C:\test\Dest.mp4";
var cnv = new MovieConverterX();
cnv.Convert(src, dest, "-cMP4 -vb 2000 -log c:\\test\\Movie.log");
if (!string.IsNullOrEmpty(cnv.ErrorMessage))
throw new Exception(cnv.ErrorMessage);
public static class Function1
{
[FunctionName("Function1")]
public static async Task Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
StringBuilder sbLogs = new StringBuilder();
sbLogs.AppendLine("started...");
try
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
var assemblyDirectoryPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
assemblyDirectoryPath = assemblyDirectoryPath.Substring(0, assemblyDirectoryPath.Length - 4);
var executablePath = $@"{assemblyDirectoryPath}\Converter\MovieConverterX.exe";
sbLogs.AppendLine(executablePath + "...");
var srcPath = $@"{assemblyDirectoryPath}\src\sample.avi";
var outPath = Path.GetTempFileName() + ".mp4";
startInfo.FileName = executablePath;
if (File.Exists(outPath))
{
File.Delete(outPath);
}
if (File.Exists(executablePath) && File.Exists(srcPath))
{
sbLogs.AppendLine("files exists...");
}
else
sbLogs.AppendLine("EXE & source files NOT exists...");
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = $"{srcPath} {outPath}";
using (Process exeProcess = Process.Start(startInfo))
{
sbLogs.AppendLine($"wait...{DateTime.Now.ToString()}");
exeProcess.WaitForExit();
sbLogs.AppendLine($"complete...{DateTime.Now.ToString()}");
}
int sleepCounter = 10;
while(!File.Exists(outPath) && sleepCounter > 0)
{
System.Threading.Thread.Sleep(1000);
sbLogs.AppendLine("sleep...");
sleepCounter--;
}
if (File.Exists(outPath))
sbLogs.AppendLine("Conversion complete successfully.");
}
catch (Exception ex)
{
sbLogs.AppendLine(ex.ToString());
}
return new OkObjectResult(sbLogs);
}
}
dim C
Set C=CreateObject("MovieConverter.MovieConverterX")
C.Convert "c:\source.avi", "c:\dest.mp4", "-cMP4 -log c:\Movie.log"
Response.Write C.ErrorMessage
set C = nothing
$src="C:\\test\\test.avi";
$dest="C:\\test\\test.mp4";
if (file_exists($dest)) unlink($dest);
$c= new COM("MovieConverter.MovieConverterX");
$c->convert($src,$dest, "-c mp4 -vb 2000 -log c:\\test\\Movie.log");
if (file_exists($dest)) echo "OK"; else echo "fail:".$c->ErrorMessage;
require 'win32ole'
c = WIN32OLE.new('MovieConverter.MovieConverterX')
src = "C:\\test\\test.avi"
dest = "C:\\test\\test.mp4"
c.convert(src, dest, "-c MP4 -log c:\\test\\Movie.log")
if not File.exist?(dest)
puts c.ErrorMessage
end
import win32com.client
import os.path
c = win32com.client.Dispatch("MovieConverter.MovieConverterX")
src = "C:\\test\\test.avi"
dest = "C:\\test\\test.mp4"
c.convert(src, dest, "-c MP4 -log c:\\test\\Movie.log")
if not os.path.exists(dest):
print(c.ErrorMessage)
uses Dialogs, Vcl.OleAuto;
var
c: OleVariant;
begin
c := CreateOleObject('MovieConverter.MovieConverterX');
c.Convert('c:\test\source.avi', 'c:\test\dest.mp4', '-cMP4 -log c:\test\Movie.log');
if c.ErrorMessage <> '' then
ShowMessage(c.ErrorMessage);
end;
var c = new ActiveXObject("MovieConverter.MovieConverterX");
c.Convert("C:\\test\\source.avi", "C:\\test\\dest.mp4", "-c MP4");
if (c.ErrorMessage != "")
alert(c.ErrorMessage)
use Win32::OLE; my $src = "C:\\test\\test.avi"; my $dest = "C:\\test\\test.mp4"; my $c = CreateObject Win32::OLE 'MovieConverter.MovieConverterX'; $c->convert($src, $dest, "-c mp4 -log c:\\test\\Movie.log"); print $c->ErrorMessage if -e $dest;
"我们接收用户上传的视频,从老旧的 AVI 到使用 H.265 的现代 MP4 都有,而播放器需要统一的 MP4/H.264 基准。Total Movie Converter X 作为 Windows 服务运行在编码服务器上;队列通过 -list 文件向其分配任务。投入生产五年,从未出过意外。在我们的硬件上,1080p 源文件的吞吐量约为实时速度的 3 倍,完全满足我们的 SLA 要求。"
Daniel R.
Senior Backend Developer at a video-streaming platform
"我们的 LMS 接收讲师以各种格式录制的课程:Mac 上的 MOV、旧 Windows 屏幕录像机的 WMV、手机的 MP4。Total Movie Converter X 在视频进入播放器之前,将所有内容统一为单一的 MP4 H.264 配置。.NET 包装器无缝接入我们现有的处理流水线;-log 输出每个文件一行,格式干净,易于发送到 Splunk。"
Petra M.
DevOps Engineer at a corporate training company
"摄像头厂商发来的是私有 AVI 变体、特定厂商的 MP4 容器,偶尔还有来自老旧 DVR 的 FLV。Total Movie Converter X 处理这一切,并为仪表板播放器提供 H.264 MP4。使用 -rotate 旋转角度错位的摄像头画面是我们每天都会用到的功能。在评估替代方案时,Windows Server Core 上的无界面运行能力是决定性因素。"
Hiroshi K.
CTO at a video-surveillance SaaS
"我们将 Total Movie Converter X 通过免版税许可证捆绑进我们的家庭视频归档产品。一次性的项目费用只是基于 FFmpeg 的商业封装库所要价格的零头。我们的安装程序部署并注册 ActiveX,我们的应用直接调用它,最终用户只看到我们的 UI。32 位 ActiveX 限制让我们在流水线返工上花了几天时间,但当我们询问解决方案时,技术支持反应迅速。"
Annika L.
Independent Software Vendor
"我们处理执法记录仪和行车记录仪的视频,作为证据处理流水线的一部分。源文件是特定厂商的 AVI 和 MP4 变体;我们将其转码为单一的归档 MP4 H.264 配置。Total Movie Converter X 在每次运行中具有确定性,这对监管链至关重要。命令行稳定,只要输入和参数相同,输出就是按位完全一致。五年的无人值守隔夜转换,没有一次失败可以归咎于该转换器。"
Tomasz W.
Lead .NET Developer at a digital-evidence platform
new COM("MovieConverter.MovieConverterX"),.NET 中使用 new MovieConverterX(),Python 中使用 win32com.client.Dispatch,Ruby 中使用 WIN32OLE.new。也可以从任何进程、调度程序或 shell 脚本中调用 MovieConverterX.exe 命令行二进制程序。-c <format> 设置输出容器/编解码器(MP4、AVI、WMV、MPEG、MOV、FLV),-vb <kbps> 设置视频比特率,-fps <rate> 设置帧率,-resize <WxH> 设置输出分辨率。音频比特率使用 -ab 控制。旋转使用 -rotate 90|180|270。这套控制项涵盖了流媒体、归档和监控流水线的转码、重新编码以及标准化工作流。-list queue.txt 用于批量任务,逐行读取文件路径。每次转换按顺序运行,文件之间释放内存,因此单个进程可处理数千个输入文件而不会泄漏。输出路径可使用 %filename% 等占位符模板,-log 标志按文件写入结构化日志行,适合接入您的日志聚合系统。