好吧,我花了几天时间研究一种合适的自动或半自动批量合并文件的方法。基本上,我想要实现的是将同一个剪辑插入到一堆其他剪辑之前。
在这种情况下,我尝试使用 .flv、.mp4、.avi 文件(总是合并相同的编解码器),但测试后没有成功所有可用程序在 Windows 和 OSx 中都可以使用。相信我,我已经尝试了所有软件。唯一可以很好地处理这些任务的软件是 Videocharge 的:水印大师和视频收费工作室。没有人能正确完成任务。也许我可以通过编写脚本来实现这一点后遗症或者索尼维加斯,我只是没有找到任何。
现在,我正在尝试通过 shell 或 unix 脚本找到某种方式来实现相同的目的...我不在乎。我只是不想只为这些任务安装 Ubuntu。我不是程序员,但我很固执(这有时会让我彻夜难眠),所以我很感激任何对批量视频处理或脚本有热情和足够好的人的帮助或指导。
目前,我发现唯一有用的路径是使用门编码或者ffmpeg通过命令,但我无法批量合并。我不关心如何对视频进行排序。但考虑到操作将对数百或数千个视频执行,将它们全部放在单独的文件夹中并附上“唯一”的介绍剪辑并不合适。我猜最合乎逻辑的方式是将“一堆”视频存储在一个文件夹中,并将介绍剪辑与编码器或渲染器放在同一个文件夹中。
在此先感谢任何帮助或指导,
答案1
好吧,我附加了视频,但从来没有在开头附加过。您可以使用 avidemux 来附加视频!
我不擅长编写 JavaScript,所以请原谅我没有为您编写脚本。这里有一个为 Avidemux 编写脚本的教程。Avidemux 是一个开源且免费的视频转换器。您可以在 avidemux 中为音频/视频添加效果并将其保存为多种格式。
该脚本是此处给出的页面链接上的示例教程:[::: 关联 :::] 脚本将简单地扫描 orgDir 目录并解压所有 AVI 文件。生成的文件将放在 destDir 目录中(使用新的 directorySearch API)。
Avidemux 函数如下:displayError、displayInfo、fileReadSelect、fileWriteSelect、allFilesFrom、nextFile
以及更多功能:加载、附加、保存、saveDVD、saveOGM、clearSegments、addSegment、goToTime、forceUnpack、setContainer
更多脚本函数请点击这里:http://www.avidemux.org/admWiki/doku.php?id=using:scripting#avidemux_functions
转换avi文件的Turotial脚本如下:
//AD <-
/*
Simple script that scans the orgDir directory
and unpack all AVI files
The resulting file is put in destDir directory
Using new directorySearch API
*/
var app = new Avidemux();
var ds = new DirectorySearch();
var orgDir;
var destDir;
var reg =new RegExp(".$");
/*
This is for Unix
For Windows change to
sep="\\";
reg2=new RegExp("\\.*\\");
*/
var sep="\\";
var reg2 =new RegExp("\/.*\/");
var extension;
var target;
//
//
//
// select files from original & target directories
//
orgDir=fileReadSelect();
destDir=fileWriteSelect();
orgDir=pathOnly(orgDir);
destDir=pathOnly(destDir);
//
// strip last \\ or //
//
orgDir=orgDir.replace(reg,"");
destDir=destDir.replace(reg,"");
print("orgDir : <"+orgDir+">");
print("destDir : <"+destDir+">");
//
// Go
//
if(ds.Init(orgDir))
{
while(ds.NextFile())
{
// Only process file we want i.e. AVI
if(!ds.isNotFile && !ds.isDirectory && !ds.isHidden && !ds.isArchive && !ds.isSingleDot && !ds.isDoubleDot)
{
extension=ds.GetExtension();
if(extension == "avi")
{
target=ds.GetFileName();
target=destDir+sep+target;
print("***"+ds.GetFileName()+"-->"+target);
processFile(orgDir+sep+ds.GetFileName(),target);
}
//print("File: "+ds.GetFileName()+" is "+ds.GetFileSize()+" bytes, extension "+extension);
}
}
print("We just searched in directory \"" + ds.GetFileDirectory() + "\"");
ds.Close();
}
else
displayError("Error initializing the directory search");
displayInfo("Finished !");
function processFile(filename, targetfile)
{
// Load the file
app.forceUnpack();
app.load(filename);
app.rebuildIndex();
app.audio.delay=0;
app.audio.mixer("NONE");
app.audio.scanVBR();
app.setContainer("AVI_UNP");
app.save(targetfile);
return 1;
}
希望这可以帮助...
来源:
答案2
非常感谢您的建议@user2377276。我真的很感激您的努力。事实上,您的解决方法是引导我走向正确方向的方法。好吧,我希望如此,因为我还没有成功。到目前为止,我最接近完成合并的方法是使用以下代码的不同变体,在与多个不同视频相同的目录中执行。要附加的唯一文件放在根目录中,我为输出创建了 C:/TEMP。
对于 ("*.flv") 中的 %a,请执行 Mencoder -oac 复制 "c:\INTRO.flv" "%a" -o "c:\TEMP\%a"
所有视频都是 FLV1,但它们的分辨率略有不同,所以基本上我得到的都是垃圾。
我不知道是否应该尝试使用 ffmpeg。有什么建议吗?
我非常确定这可以实现而无需重新编码,因为我测试了几个程序,它们都没有重新编码,它们只是在某些情况下强制分辨率。事实上,表现最好的程序似乎是 AIR 应用程序 Rich Flv,但它不适用于批处理。