GNU/Linux >> Tutoriales Linux >  >> Linux

Edición de video de línea de comandos en Linux (cortar, unir y previsualizar)

Ok, ya que no puedo encontrar mucho sobre melt uso de la línea de comandos, aquí hay algunas notas... (y después de esto, vea esta respuesta ¿Usando la sustitución de procesos para engañar a los programas que esperan archivos, con extensiones específicas como argumento? - Unix &Linux Stack Exchange para un ejemplo de secuencia de comandos a través de bash )

Para empezar, hay un paquete Ubuntu/Debian para melt (Tengo Ubuntu 11.04 con MLT melt 0.6.2); el enlace proporcionado por @Ielton es para el wiki "Media Lovin' Toolkit" (MLT), que melt es parte de (pero también openshot y kdenlive ). Aquí está el enlace a los archivos de texto de documentación de su git:mltframework.org/mlt.git/tree - docs/; tenga en cuenta que la wiki tiene una página sobre BuildScripts.

Por ahora, el mayor (único) problema que tengo es que no puedo encontrar una manera de exportar una composición de video sin comprimir (ya sea como png fotogramas o algún formato de vídeo sin comprimir).

Primero, en la línea de comandos melt puede controlar la reproducción a través de fotogramas; por ejemplo, para "crear" un espacio en blanco blanco de 15 cuadros de largo y verlo con el melt incorporado jugador, uso

melt -blank 15

Cuando ves con melt , también obtendrá una información de línea de comando para stderr para el reproductor incorporado:

$ 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

Una vez melt finaliza la reproducción, no se cerrará, por lo que debe escribir q para salir de ella.

Debemos tener en cuenta que hay los llamados "productores" y "consumidores" en melt . Si no se especifica nada, entonces el "consumidor" predeterminado es una ventana SDL (Simple DirectMedia Layer) que reproduce el video; por lo que el comando anterior es el mismo que:

melt -blank 15 -consumer sdl

Así, si queremos guardar lo que melt pantallas, debemos cambiar el consumidor a algo que admita un formato de archivo. Para obtener una lista de consumidores:

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

El libdv el consumidor generará datos con formato DV directamente a stdout , para guardar el video en un .dv archivo que haría:

melt -blank 15 -consumer libdv > test.dv

Tenga en cuenta que de los consumidores enumerados, el único formato que he probado, que también se puede abrir en otra aplicación es libdv (Usé vlc como otra aplicación); sin embargo, esto puede fallar para un tipo diferente de transcodificación (por ejemplo, si en lugar de un espacio en blanco, trato de convertir un fragmento de un .flv archivo, el archivo .dv resultante se abre y se reproduce en vlc , pero está corrupto ).

Ahora para la edición parte; esencialmente, puede especificar una serie de file-name estrofas /in/out directamente en la línea de comando; digamos que tienes un archivo, video.avi - entonces podrías hacer:

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

o ligeramente mejor formateado:

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

Esto significa video.avi desde su cuadro 30 hasta su cuadro 79 se reproducirá; luego un espacio en blanco de 15 fotogramas; y luego el video.avi secuencia del fotograma 30 al fotograma 79 de nuevo.

Para utilizar imágenes (digamos, .png ) en una composición de edición de video:

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

Tenga en cuenta que para test.png , in= el parámetro no necesita ser 0; sin embargo, la imagen se mostrará para out -in tiempo; en este caso, sería más fácil simplemente dejar el in=0 parámetro fuera por completo.

Lo bueno es que esta secuencia de edición se puede guardar, o como melt lo llama, serializado - a un archivo; tenga en cuenta que hay dos formas de tal serialización:"simple" o XML. Por ejemplo, para guardar el comando anterior como un archivo serializado "simple", podemos agregar el -serialise [filename] cambie al comando:

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

Ahora el file.melt contiene:

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

Aparentemente, este formato de archivo serializado "simple" no contiene un carácter de "comentario", si trato de agregar un "# comment " línea, melt se queja con:'Error al cargar "# comentario" ' (pero aparte de eso, parece que esa línea se ignora y la reproducción continúa de todos modos). ".melt " parece ser una extensión que melt reconoce como un archivo serializado simple.

Ahora, para reproducir este archivo serializado, en principio podríamos simplemente llamar a melt file.melt - sin embargo, una línea de comando más completa sería:

melt melt_file:file.melt -consumer sdl

... lo que significaría:usa el melt_file "productor" para abrir file.melt , y renderiza sus marcos en el "consumidor" sdl (ventana).

Tenga en cuenta que tengo la experiencia, que (digamos) .flv los videos se reproducen sin problemas en la línea de comando; sin embargo, causan una falla de segmentación cuando se especifican en el file.melt archivo serializado! .dv videos producidos por melt en sí, parece funcionar bien en file.melt ...

El tipo XML de serialización se puede lograr usando el -consumer xml: interruptor (en lugar de -serialise ), por lo que el ejemplo anterior ahora sería:

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

Para "reproducir" el file.mlt recién generado archivo XML, ahora se puede hacer directamente melt file.mlt - o, una línea de comando más completa sería:

melt xml:file.mlt -consumer sdl

... lo que significaría:usa el xml "productor" (nota, anteriormente era un consumidor ) para abrir file.mlt , y renderiza sus marcos en el "consumidor" sdl (ventana).

Tenga en cuenta que en este caso, he experimentado que el mismo .flv videos que causaron una falla de segmento con un archivo de serialización simple:¡funciona bien con un archivo de serialización XML!

En este caso, el file.mlt resultante El archivo XML tiene muchas más configuraciones, como resolución, velocidad de fotogramas, información de códec, etc., pero también es más difícil trabajar con él directamente en un editor de texto:

<?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>

Sí hay. Intente usar la aplicación llamada "Melt". Consulte la documentación aquí.

Si usa una distribución derivada de Debian:

apt-get install melt

La solución ffmpeg para este problema se parece a esto:

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

Utiliza canalizaciones con nombre, por lo que no es necesario crear archivos temporales en el disco y le permite cortar fragmentos de los videoclips y agregar imágenes.

Este ejemplo usa el tiempo 30-60 de la primera entrada y luego agrega el primer minuto de la segunda entrada, luego inserta un archivo de imagen y luego el tercer video completo.

Código extraído de:

Página de concatenación de ffmpeg:https://trac.ffmpeg.org/wiki/Concatenate

página de superusuario Usando ffmpeg para cortar video

página de superusuario https://video.stackexchange.com/questions/12105/add-an-image-in-front-of-video-using-ffmpeg


Linux
  1. Conversores de vídeo de código abierto para Linux [GUI y CLI]

  2. Corte/Grep Y Df -h?

  3. Historial de línea de comandos en Linux

  4. 4 Uso esencial y práctico del comando Cut en Linux

  5. Cinelerra GG Infinity:un software gratuito de edición de video para Linux

Los mejores convertidores de video gratuitos para Linux [GUI, CLI y en línea]

50 comandos de corte de Linux simples y útiles en Unix con ejemplos

Los 20 mejores software y herramientas de videoconferencia de Linux

OpenShot:un editor de video simple y poderoso para Linux

15 mejores programas de edición de video para sistema Linux

¿Qué aplicaciones de edición de video están disponibles en Linux?