3

我的目标是创建一个将 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)
4

3 回答 3

4

我知道您使用的是 Windows,但这里是我在 linux 上从多个 AVI 创建 DVD 的步骤。主要的三个程序是ffmpeg进行转码、dvdauthor构建 DVD 文件系统以及从 DVD 文件系统growisofs制作 DVD 映像。我认为您可以通过 Google 找到它们每个的 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 文件的所有详细信息。您可能还必须/dev/dvd/在 growisofs 命令中替换 Windows DVD 刻录机驱动器号。

关于您希望您可以跳过从 avi 到 mpeg-2 的转码:没有办法做到这一点,并且仍然使其与 DVD 标准兼容,该标准严格要求 MPEG-PS(节目流)容器中的 MPEG-2 视频。

于 2010-02-16T01:29:41.063 回答
1

问题是您是要创建视频 DVD(即可以在普通 DVD 播放器中播放的内容)还是只是将恰好包含视频的文件保存到数据 DVD 光盘。

如果您想要在 DVD 播放器中播放的内容,则需要将其从 AVI 转码为 DVD 播放器所期望的 MPEG 2 编码,然后将 MPEG2 位流转换为 VOB 文件,并创建 VIDEO_TS(和此类)任何 DVD 所需的目录。

如果您只想将文件刻录到数据 DVD,您可以使用(例如)Microsoft 的 Image Mastering API (IMAPI);我相信 API 的第 2 版是最新的,因此您需要使用的主要内容是 COM 接口 IFileSystemImage(用于创建图像文件)和 IDiscFormat2Data 以将数据写入光盘。

于 2010-02-15T22:24:36.317 回答
1

试试Primo DVD 组件,它们还有一个 mpeg-2 编码库。

或者,使用ffmpeg库来转换您的 avis。

于 2010-02-15T21:41:53.497 回答