31

У меня довольно простые потребности в редактировании - мне нужно разрезать несколько видео, возможно, вставить несколько PNG между ними и присоединиться к этим видео (не нужны переходы, эффекты и т.д.). По сути, pitivi будет делать то, что я хочу - за исключением того, что я использую 640x480 AVI с частотой 30 кадров в секунду с камеры, и как только я добавляю более пары минут такого материала, pitivi начинает зависать при предварительном просмотре и, таким образом, становится непригодным для использования.

Итак, я начал искать инструмент командной строки для Linux; Я думаю, что только ffmpeg (командная строка - Использование ffmpeg для разрезания видео - Super User) и mplayer (Sam - Редактирование видеофайла с помощью mencoder под linux) пока что являются кандидатами, но я не могу найти примеры использования, которое имею в виду.

 

По сути, я бы предположил, что есть инструменты для кодирования и проигрывания (например, ffmpeg vs ffplay ; или mencoder vs mplayer) - такие, что для начала последовательность редактирования может быть указана непосредственно в командной строке, предпочтительно с разрешением кадра - псевдокод будет выглядеть так:

videnctool -compose --file=vid1.avi --start=00:00:30:12 --end=00:01:45:00 --file=vid2.avi --start=00:05:00:00 --end=00:07:12:25 --file=mypicture.png --duration=00:00:02:00 --file=vid3.avi --start=00:02:00:00 --end=00:02:45:10 --output=editedvid.avi

... или может иметь текстовый файл "playlist", например:

vid1.avi      00:00:30:12 00:01:45:00 
vid2.avi      00:05:00:00 00:07:12:25 
mypicture.png -           00:00:02:00
vid3.avi      00:02:00:00 00:02:45:10 

... так что это может быть вызвано с

videnctool -compose --playlist=playlist.txt --output=editedvid.avi

Идея здесь будет заключаться в том, что все видео имеют одинаковый формат, что позволяет инструменту избежать перекодирования, а вместо этого просто выполнить "сырое копирование" (как в mencoder copy : « -oac copy -ovc copy ») - или в отсутствие этого, несжатый аудио / видео будет в порядке (хотя это займет немного места). В случае неподвижного изображения инструмент будет использовать кодировку, установленную видеофайлами.

 

Дело в том, что до сих пор я вижу, что mencoder и ffmpeg могут работать с отдельными файлами; например, вырезать один раздел из одного файла или объединить файлы (у mencoder также есть Редактировать списки решений (EDL), которые можно использовать для резки с точностью до кадра - так что вы можете определить несколько областей вырезания, но это снова относится к одному файл). Это подразумевает, что я должен сначала порезать куски из отдельных файлов (каждый из которых потребует собственный временный файл на диске), а затем объединить их в окончательный видеофайл.

Затем я хотел бы представить, что существует соответствующий инструмент проигрывателя, который может считывать тот же файл формата параметров командной строки / файла списка воспроизведения, что и инструмент кодирования, за исключением того, что он не будет генерировать выходной файл, а вместо этого воспроизводит видео; например, в псевдокоде:

vidplaytool --playlist=playlist.txt --start=00:01:14 --end=00:03:13

... и, при наличии достаточного объема памяти, он генерирует предварительный просмотр видео в ОЗУ с низким разрешением и воспроизводит его в окне, предлагая при этом некоторое ограниченное взаимодействие (например, сочетания клавиш mplayer для воспроизведения, паузы, перемотки назад, шага Рамка). Конечно, я представляю время начала и окончания для ссылки на весь список воспроизведения и включаю любой файл, который может оказаться в этом регионе в списке воспроизведения.

Таким образом, конечным результатом всего этого будет: операция командной строки; нет временных файлов при выполнении редактирования - а также нет временных файлов (или транскодирования) при рендеринге окончательного вывода ... что я сам думаю было бы неплохо.

Итак, хотя я думаю, что все вышеперечисленное может быть немного натянутым - существует ли что-нибудь, что приближало бы рабочий процесс, описанный выше?

4 ответа4

22

Хорошо, так как я не могу найти много информации об использовании командной строки melt , вот некоторые заметки ... (и после этого посмотрите этот ответ. Использование подстановки процессов для обмана программ, ожидающих файлы с конкретными расширениями в качестве аргумента? - Unix & Linux Stack Exchange для пример скрипта через bash)

Для начала - есть пакет Ubuntu/Debian для melt (у меня Ubuntu 11.04 с MLT melt 0.6.2); ссылка, предоставленная @Ielton, предназначена для вики MediaLovin 'Toolkit (MLT), частью которого является melt (но также openshot и kdenlive). Вот ссылка на текстовые файлы документации из их git: mltframework.org/mlt.git/tree - docs/ ; обратите внимание, что в вики есть страница о BuildScripts.

На данный момент самая большая (единственная) проблема, с которой я сталкиваюсь, заключается в том, что я не могу найти способ экспортировать несжатую композицию видео (либо в виде png кадров, либо в некоторый несжатый видеоформат).

 

Во-первых, в командной строке melt вы можете управлять воспроизведением через кадры; например, чтобы "создать" длинную белую заготовку в 15 кадров и просмотреть ее с помощью встроенного проигрывателя melt , используйте

melt -blank 15

Когда вы просматриваете с melt , вы также получите информацию о командной строке для stderr для встроенного проигрывателя:

$ melt -blank 15 
+-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+
|1=-10| |2= -5| |3= -2| |4= -1| |5=  0| |6=  1| |7=  2| |8=  5| |9= 10|
+-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+
+---------------------------------------------------------------------+
|               H = back 1 minute,  L = forward 1 minute              |
|                 h = previous frame,  l = next frame                 |
|           g = start of clip, j = next clip, k = previous clip       |
|                0 = restart, q = quit, space = play                  |
+---------------------------------------------------------------------+
Current Position:         15

После того, как melt сделано воспроизведение, это не выход - так что вы должны ввести q , чтобы выйти из нее.

Следует отметить, что в melt присутствуют так называемые "производители" и "потребители". Если ничего не указано, то "потребителем" по умолчанию является окно SDL (Simple DirectMedia Layer), воспроизводящее видео; поэтому приведенная выше команда такая же как:

melt -blank 15 -consumer sdl

Таким образом, если мы хотим сохранить то, что отображает melt , мы должны изменить потребителя на что-то, что будет поддерживать формат файла. Чтобы получить список потребителей:

$ melt -query "consumers"
---
consumers:
  - sdl
  - sdl_audio
  - sdl_preview
  - sdl_still
  - gtk2_preview
  - avformat
  - libdv
  - xml
  - decklink
  - null
...

Потребитель libdv будет выводить данные в формате DV непосредственно в stdout , поэтому для сохранения видео в файл .dv вы должны сделать следующее:

melt -blank 15 -consumer libdv > test.dv

Обратите внимание, что из перечисленных потребителей единственным форматом, который я пробовал, который также можно открыть в другом приложении, является libdv (я использовал vlc качестве другого приложения); однако это может не работать для транскодирования другого типа (например, если вместо пустого я пытаюсь преобразовать фрагмент из файла .flv , полученный файл .dv открывается и воспроизводится в vlc , но поврежден).

 

Теперь для редактирования части; по сути, вы можете указать ряд разделов file-name/in/out прямо в командной строке; скажем, у вас есть файл video.avi - тогда вы можете сделать:

melt video.avi in=30 out=79 -blank 15 video.avi in=30 out=79

или чуть лучше отформатирован:

melt \ 
video.avi in=30 out=79 \ 
-blank 15 \
video.avi in=30 out=79

Это означает, что video.avi от его кадра 30 до его кадра 79 будет воспроизводиться; затем 15-кадровый бланк; и затем последовательность video.avi от кадра 30 до кадра 79 снова.

Чтобы использовать изображения (скажем, .png) в композиции для редактирования видео:

melt \
video.avi in=30 out=79 \
test.png in=0 out=15 \
video.avi in=30 out=79 \
-blank 15

Обратите внимание , что для test.png in= параметр не должен быть 0 - однако, изображение будет отображаться для out - in время; в этом случае проще всего вообще не указывать параметр in=0 .

 

Хорошо, что эту последовательность редактирования можно сохранить - или, как ее называет melt , сериализовать - в файл; Обратите внимание, что существует два способа такой сериализации: "простой" или XML. Например, чтобы сохранить указанную выше команду как "простой" сериализованный файл, мы можем просто добавить в команду -serialise [filename] :

$ melt video.avi in=30 out=79 -blank 15 video.avi in=30 out=79 -serialise file.melt 
Project saved as file.melt.

Теперь file.melt содержит:

video.avi
in=30
out=79
-blank
15
video.avi
in=30
out=79

По-видимому, этот "простой" сериализованный формат файла не содержит символа "комментирования" - если я пытаюсь добавить строку « # comment », melt жалуется: « Не удалось загрузить« # comment » » (но кроме этого, кажется, что такая строка игнорируется, и воспроизведение продолжается в любом случае). « .melt » - это расширение, которое melt распознает как простой сериализованный файл.

Теперь, чтобы повторно воспроизвести этот сериализованный файл, мы могли бы в принципе просто вызвать melt file.melt - однако, более полная командная строка была бы:

melt melt_file:file.melt -consumer sdl

... что означало бы: используйте melt_file "продюсер", чтобы открыть file.melt , и визуализировать его фреймы в "потребительском" sdl (окне).

Обратите внимание, что у меня есть опыт, что (скажем) .flv видео воспроизводятся без проблем в командной строке - однако, вызывают ошибку сегментации, когда они указаны в сериализованном файле file.melt ! .dv видео, созданные самим melt , похоже, отлично работают в file.melt ...

 

XML-тип сериализации может быть достигнут с помощью параметра -consumer xml: (вместо -serialise), поэтому приведенный выше пример теперь будет выглядеть так:

melt video.avi in=30 out=79 -blank 15 video.avi in=30 out=79 -consumer xml:file.mlt

Чтобы "воспроизвести" только что созданный XML-файл file.mlt , теперь можно напрямую melt file.mlt - или более полная командная строка будет выглядеть так:

melt xml:file.mlt -consumer sdl

... что означало бы: используйте xml "продюсер" (заметьте, ранее он был потребителем), чтобы открыть file.mlt и отобразить его фреймы в "потребительском" sdl (окне).

Обратите внимание, что в этом случае я обнаружил, что те же самые видео .flv которые вызвали segfault с простым файлом сериализации - прекрасно работают с файлом сериализации XML!

В этом случае полученный XML-файл file.mlt имеет гораздо больше настроек, таких как разрешение, частота кадров, информация о кодеках и т.д., Но с ним также сложнее работать напрямую в текстовом редакторе:

<?xml version="1.0" encoding="utf-8"?>
<mlt root="/path/to" title="video.avi">
  <profile description="automatic" width="320" height="240" progressive="1" sample_aspect_num="1" sample_aspect_den="1" display_aspect_num="320" display_aspect_den="240" frame_rate_num="25" frame_rate_den="1" colorspace="601"/>
  <producer id="producer0" in="30" out="79">
    <property name="mlt_type">producer</property>
    <property name="aspect_ratio">1.000000</property>
    <property name="length">125</property>
    <property name="eof">pause</property>
    <property name="resource">video.avi</property>
    <property name="meta.media.nb_streams">2</property>
    <property name="meta.media.0.stream.type">video</property>
    <property name="meta.media.0.stream.frame_rate">25.000000</property>
    <property name="meta.media.0.stream.sample_aspect_ratio">0.000000</property>
    <property name="meta.media.0.codec.frame_rate">25.000000</property>
    <property name="meta.media.0.codec.pix_fmt">yuv420p</property>
    <property name="meta.media.0.codec.sample_aspect_ratio">1.000000</property>
    <property name="meta.media.0.codec.colorspace">601</property>
    <property name="meta.media.0.codec.name">mpeg4</property>
    <property name="meta.media.0.codec.long_name">MPEG-4 part 2</property>
    <property name="meta.media.0.codec.bit_rate">0</property>
    <property name="meta.media.1.stream.type">audio</property>
    <property name="meta.media.1.codec.sample_fmt">s16</property>
    <property name="meta.media.1.codec.sample_rate">22050</property>
    <property name="meta.media.1.codec.channels">1</property>
    <property name="meta.media.1.codec.name">mp2</property>
    <property name="meta.media.1.codec.long_name">MP2 (MPEG audio layer 2)</property>
    <property name="meta.media.1.codec.bit_rate">64000</property>
    <property name="seekable">1</property>
    <property name="meta.media.sample_aspect_num">1</property>
    <property name="meta.media.sample_aspect_den">1</property>
    <property name="meta.attr.title.markup"></property>
    <property name="meta.attr.author.markup"></property>
    <property name="meta.attr.copyright.markup"></property>
    <property name="meta.attr.comment.markup"></property>
    <property name="meta.attr.album.markup"></property>
    <property name="audio_index">1</property>
    <property name="video_index">0</property>
    <property name="mlt_service">avformat</property>
  </producer>
  <producer id="producer1" in="30" out="79">
    <property name="mlt_type">producer</property>
    <property name="aspect_ratio">1.000000</property>
    <property name="length">125</property>
    <property name="eof">pause</property>
    <property name="resource">video.avi</property>
    <property name="meta.media.nb_streams">2</property>
    <property name="meta.media.0.stream.type">video</property>
    <property name="meta.media.0.stream.frame_rate">25.000000</property>
    <property name="meta.media.0.stream.sample_aspect_ratio">0.000000</property>
    <property name="meta.media.0.codec.frame_rate">25.000000</property>
    <property name="meta.media.0.codec.pix_fmt">yuv420p</property>
    <property name="meta.media.0.codec.sample_aspect_ratio">1.000000</property>
    <property name="meta.media.0.codec.colorspace">601</property>
    <property name="meta.media.0.codec.name">mpeg4</property>
    <property name="meta.media.0.codec.long_name">MPEG-4 part 2</property>
    <property name="meta.media.0.codec.bit_rate">0</property>
    <property name="meta.media.1.stream.type">audio</property>
    <property name="meta.media.1.codec.sample_fmt">s16</property>
    <property name="meta.media.1.codec.sample_rate">22050</property>
    <property name="meta.media.1.codec.channels">1</property>
    <property name="meta.media.1.codec.name">mp2</property>
    <property name="meta.media.1.codec.long_name">MP2 (MPEG audio layer 2)</property>
    <property name="meta.media.1.codec.bit_rate">64000</property>
    <property name="seekable">1</property>
    <property name="meta.media.sample_aspect_num">1</property>
    <property name="meta.media.sample_aspect_den">1</property>
    <property name="meta.attr.title.markup"></property>
    <property name="meta.attr.author.markup"></property>
    <property name="meta.attr.copyright.markup"></property>
    <property name="meta.attr.comment.markup"></property>
    <property name="meta.attr.album.markup"></property>
    <property name="audio_index">1</property>
    <property name="video_index">0</property>
    <property name="mlt_service">avformat</property>
  </producer>
  <playlist id="playlist0">
    <entry producer="producer0" in="0" out="49"/>
    <blank length="16"/>
    <entry producer="producer1" in="0" out="49"/>
  </playlist>
  <tractor id="tractor0" title="video.avi" global_feed="1" in="0" out="115">
    <track producer="playlist0"/>
  </tractor>
</mlt>
17

Да, есть. Попробуйте использовать приложение под названием "Melt". Смотрите документацию здесь:

https://www.mltframework.org/docs/melt/

Если вы используете дистрибутив Debian:

apt-get install melt
6

Решение этой проблемы ffmpeg выглядит примерно так:

mkfifo temp1 temp2 temp3
ffmpeg -i input.wmv -ss 30 -to 60 -c copy output.wmv temp1 2> /dev/null & \
ffmpeg -i input2.wmv -t 60 -c copy temp2 2> /dev/null & \
ffmpeg -i input3.wmv -i image.png -filter_complex "[0:v][1:v] \
overlay=25:25:enable='between(t,0,20)'" -pix_fmt yuv420p -c:a copy temp3 2> /dev/null & \
ffmpeg -f mpegts -i "concat:temp1|temp2|temp3" -c copy output.mp4

Он использует именованные каналы, поэтому нет необходимости создавать временные файлы на диске, он позволяет разрезать фрагменты видеоклипов и добавлять изображения.

В этом примере используется время 30-60 первого ввода, затем добавляется первая минута второго ввода, затем вставляется файл изображения, а затем все третье видео.

Код снят с:

Страница сцепления ffmpeg:https://trac.ffmpeg.org/wiki/Concatenate

Страница суперпользователя Использование ffmpeg для разрезания видео

страница суперпользователя https://video.stackexchange.com/questions/12105/add-an-image-in-front-of-video-using-ffmpeg

4

Я тоже искал такой инструмент, и кажется, что расплав - это инструмент для работы, однако документацию практически невозможно понять / пропустить. Вы можете сделать практически любую комбинацию редактирования. У меня были кадры с "экшн-камеры" ... хотя звук был непригодным. Я присоединился к видео (h264), добавил 60-кадровое замирание и заменил звук звуковой дорожкой, используя:

% melt -video-track vid1.avi vid2.avi -mix 60 -mixer luma vid3.avi \
   -mix 60 -mixer luma -audio-track vorbis:track1.ogg vorbis:track2.ogg \
   -consumer avformat:OUT.avi acodec=libmp3lame vcodec=libx264

Вы можете прочитать больше об этом здесь. Основной сайт здесь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .