我的目标是创建一个程序,将AVI文件作为输入,然后执行将其刻录到DVD所需的任何内容。
目前,我使用三个独立的程序来完成此任务。第一个工具要求我将其从AVI文件转换为MPEG。第二个工具采用MPEG并创建DVD文件(VIDEO_TS文件夹,其中包含一些文件)。第三个工具将文件夹刻录到DVD。我想将这三个工具合二为一,如果可能的话,跳过AVI到MPEG的转换,只需创建DVD文件并刻录它们。
目标平台是Windows 7,我将使用的语言是C ++。
哪些图书馆或命令行程序可以帮助我追求荣耀?
编辑:为了澄清,我想创建一个视频DVD来在DVD播放器上播放电影。 (谢谢杰里)
编辑2:我最终在Linux上使用Python来自动化所有内容。这是脚本,以防任何人需要它。 (注意:这是我的第一个python脚本,所以它可能不是很好)
import sys
import os
import shutil
from subprocess import call
# step 1: call ffmpeg and convert the input avi to an mpeg-2
def avi_to_mpeg(input, output):
return call(["ffmpeg", "-i", input, "-target", "ntsc-dvd", "-threads", "4", output])
# step 2: create the xml file needed for dvdauthor
def create_xml_file(mpg_source, xml_file):
with open(xml_file, "w") as file:
file.write("<dvdauthor>\n")
file.write("\t<vmgm />\n")
file.write("\t<titleset>\n")
file.write("\t\t<titles>\n")
file.write("\t\t\t<pgc>\n")
file.write("\t\t\t\t<vob file=\"" + mpg_source + "\" />\n")
file.write("\t\t\t</pgc>\n")
file.write("\t\t</titles>\n")
file.write("\t</titleset>\n")
file.write("</dvdauthor>\n")
return os.path.isfile(xml_file)
# step 3: invoke dvdauthor
def author_dvd(mpg_source):
return call(["dvdauthor", "-o", "mkdvd_temp", "-x", xml_file])
# step 4: finally, burn the files to the dvd
def burn_dvd(dvd_target):
return call(["growisofs", "-Z", dvd_target, "-dvd-video", "mkdvd_temp"])
# step 5: clean up the mess
def clean_up(mpg_source, xml_file):
shutil.rmtree("mkdvd_temp")
os.remove(mpg_source)
os.remove(xml_file)
def eject(dvd_target):
return call(["eject", dvd_target])
def print_usage():
print "mkdvd by kitchen"
print "usage: mkdvd -s file.avi -t /dev/disc"
print " -s : Input .AVI file"
print " -t : Target disc, /dev/dvd for example"
def get_arg(sentinel):
last_arg = ""
for arg in sys.argv:
if last_arg == sentinel:
return arg
last_arg = arg
return None
# program start
avi_source = get_arg("-s") # input .avi file
dvd_target = get_arg("-t") # the disc to burn it to (/dev/dvd for example)
if avi_source == None or dvd_target == None:
print_usage()
sys.exit("Not enough parameters.")
if os.path.isfile(avi_source) == False:
sys.exit("File does not exists (" + avi_source + ")")
mpg_source = avi_source + ".mpg"
if avi_to_mpeg(avi_source, mpg_source) != 0:
sys.exit("Failed to convert the AVI to an MPG")
xml_file = mpg_source + ".xml"
if create_xml_file(mpg_source, xml_file) == False:
sys.exit("Failed to create the XML file required by dvdauthor")
if author_dvd(mpg_source) != 0:
sys.exit("Failed to create the DVD files")
if burn_dvd(dvd_target) != 0:
sys.exit("Failed to burn the files to the disc")
print "mkdvd has finished burning " + avi_source + " to " + dvd_target
print "Cleaning up"
clean_up(mpg_source, xml_file)
eject(dvd_target)
答案 0 :(得分:4)
我知道你正在使用Windows,但这里是我从linux上的多个AVI创建DVD的步骤。主要的三个程序ffmpeg
用于转码,dvdauthor
用于构建DVD文件系统,growisofs
用于从DVD文件系统制作DVD映像。我认为你可以通过谷歌找到每个人的Windows二进制文件(我只能快速,但我不想粘贴所有链接)。
转码每个avi:
ffmpeg -i <infile.avi> -target ntsc-dvd -threads 2 <outfile.mpg>
为DVD作者创建xml文件:
示例:
<dvdauthor dest="dvd">
<vmgm>
</vmgm>
<titleset>
<titles>
<pgc>
<vob file="<file1.mpg>" chapters="0,5:00,10:00,15:00,20:00,25:00,30:00,35:00,40:00" />
</pgc>
<pgc>
<vob file="<file2.mpg>" chapters="0,5:00,10:00,15:00,20:00,25:00,30:00,35:00,40:00" />
</pgc>
</titles>
</titleset>
</dvdauthor>
创建DVD文件结构(将在上面显示的dest处创建):
dvdauthor -x <xmlfile.xml>
将文件系统转换为iso并刻录它。
growisofs -Z /dev/dvd -dvd-video dvd/
其中dvd /是创建DVD文件系统的地方。
只需调用正确的命令行程序并创建dvdauthor xml文件,即可轻松实现此过程的自动化。您需要阅读dvdauthor的文档,以了解有关定义DVD的xml文件的所有详细信息。您还可能需要将growisofs命令中的/dev/dvd/
替换为Windows DVD刻录机驱动器号。
关于你希望你可以跳过从avi到mpeg-2的转码:没有办法做到这一点,仍然使它与严格要求MPEG-PS(节目流)中的MPEG-2视频的DVD标准兼容容器。
答案 1 :(得分:1)
尝试Primo DVD components,他们也有一个mpeg-2编码库。
或者,使用ffmpeg库来转换你的avis。
答案 2 :(得分:1)
问题在于您是要创建视频DVD(即可以在普通DVD播放器中播放的内容),还是只将包含视频的文件保存到数据DVD光盘。
如果您想要在DVD播放器中播放的内容,那么您需要将其从AVI转码为DVD播放器所需的MPEG 2编码,然后将MPEG2比特流转换为VOB文件,并创建任何DVD都需要VIDEO_TS(等)目录。
如果您只想将文件刻录到数据DVD,则可以使用(例如)Microsoft的Image Mastering API(IMAPI);我相信API的第2版是最新的,所以你需要使用的主要内容是COM接口IFileSystemImage(用于创建图像文件)和IDiscFormat2Data用于将数据写入光盘。