C ++ - Какие библиотеки или программы командной строки мне понадобятся для создания программы, которая берет файл AVI и записывает его на DVD? - PullRequest
3 голосов
/ 16 февраля 2010

Моя цель - создать программу, которая будет принимать AVI-файл в качестве входных данных, а затем делать все необходимое для его записи на DVD.

В настоящее время я использую три отдельные программы для достижения этой цели. Первый инструмент требует, чтобы я преобразовал его из файла AVI в MPEG. Второй инструмент берет этот MPEG и создает файлы DVD (папка VIDEO_TS с несколькими файлами внутри). Третий инструмент записывает папку на DVD. Я хотел бы объединить эти три инструмента в один и, если возможно, пропустить преобразование AVI в MPEG и просто создать файлы DVD и записать их.

Целевая платформа - Windows 7, а язык, который я собираюсь использовать, - C ++.

Какие библиотеки или программы командной строки помогут мне в моем стремлении к славе?

РЕДАКТИРОВАТЬ: Чтобы уточнить, я хочу создать видео DVD для воспроизведения фильмов на DVD-плеере. (Спасибо Джерри)

РЕДАКТИРОВАТЬ 2: Я закончил использовать Python на Linux для автоматизации всего. Вот сценарий на случай, если это кому-нибудь понадобится. (Примечание: это мой первый скрипт на 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)

Ответы [ 3 ]

4 голосов
/ 16 февраля 2010

Я знаю, что вы используете Windows, но вот шаги, которые я предпринимаю, чтобы создать DVD из нескольких AVI на Linux. Основными тремя программами являются ffmpeg для перекодирования, dvdauthor для создания файловой системы DVD и growisofs для создания образа DVD из файловой системы DVD. Я думаю, что вы можете найти бинарные файлы Windows для каждого из них через Google (я просто смог довольно быстро, но я не хочу вставлять все ссылки).

  • Перекодировать каждый avi:

    ffmpeg -i <infile.avi> -target ntsc-dvd -threads 2 <outfile.mpg>
    
  • Создание XML-файла для DVD-автора:

    Пример:

    <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 (создаст ее по указанному выше адресу):

    dvdauthor -x <xmlfile.xml>
    
  • Сверните файловую систему в iso и запишите ее.

    growisofs -Z /dev/dvd -dvd-video dvd/
    

    где dvd / - это место, где была создана файловая система DVD.

Этот процесс можно довольно легко автоматизировать, просто вызвав нужные программы командной строки и создав файл dvdauthor xml. Вы захотите прочитать документацию для dvdauthor, чтобы узнать все подробности о файле xml, который определяет ваш DVD. Вам также, вероятно, придется заменить /dev/dvd/ в команде growisofs на букву дисковода DVD-дисков Windows.

О вашей надежде на то, что вы можете пропустить транскод с avi на mpeg-2: сделать это невозможно, но совместить его со стандартом DVD, который строго требует видео MPEG-2 в MPEG-PS (программный поток) ) контейнер.

1 голос
/ 16 февраля 2010

Вопрос заключается в том, хотите ли вы создать видео-DVD (то есть что-то, что будет воспроизводиться на обычном DVD-плеере) или просто сохранить файл, содержащий видео, на DVD-диске с данными.

Если вам нужно что-то, что будет воспроизводиться на DVD-плеере, вам нужно будет перекодировать его из AVI в кодировку MPEG 2, которую ожидает DVD-плеер, а затем превратить битовый поток MPEG2 в файлы VOB и создать VIDEO_TS (и другие) каталоги, необходимые для любого DVD.

Если вы просто хотите записать файл на DVD-диск с данными, вы можете использовать (для одного примера) Microsoft Mastering API (IMAPI); Я полагаю, что версия 2 API является актуальной, поэтому вам нужно будет использовать COM-интерфейсы IFileSystemImage (для создания файла образа) и IDiscFormat2Data для записи данных на диск.

1 голос
/ 16 февраля 2010

Попробуйте компоненты Primo DVD , они также имеют библиотеку кодирования mpeg-2.

Либо используйте библиотеку ffmpeg , чтобы преобразовать свой avis.

...