Este proyecto es un borrador y no pretende ser utilizado por nadie.
vtcff es una biblioteca para transcodificar entre formatos de video con énfasis en mantener la calidad y la profundidad de color en las tuberías de producción de video. En las tareas de estudio, los segundos de video toman gigabytes y los compromisos de calidad son menos deseables.
vtcff tiende a maximizar la calidad, sacrificando la velocidad y el espacio en el disco.
vtcff es en realidad un envoltorio para ffmpeg , la herramienta de video menos intuitiva jamás creada.
$ pip3 install vtcffEste comando instalará el paquete, pero no FFMPEG.
$ pip3 install git+https://github.com/rtmigo/vtcff_py@staging#egg=vtcff import subprocess
from vtcff import FfmpegCommand , Scale , Transpose , Hevc
cmd = FfmpegCommand ()
cmd . src_file = '/path/to/source.mov'
cmd . dst_file = '/path/to/target.mov'
# set set some filters
cmd . scale = Scale ( 1920 , 1080 )
cmd . transpose = Transpose . CLOCKWISE
# set compression format
cmd . dst_codec_video = Hevc ( mbps = 100 )
# run command
subprocess . check_call ( list ( cmd )) import subprocess , os
from vtcff import FfmpegCommand , Prores
cmd = FfmpegCommand ()
cmd . src_file = 'source.mov'
cmd . dst_file = 'target.mov'
cmd . dst_codec_video = Prores ()
print ( str ( cmd ))
# ffmpeg -i source.mov -codec:v prores_ks target.mov
print ( list ( cmd ))
# ['ffmpeg', '-i', 'source.mov', '-codec:v', 'prores_ks', 'target.mov']
# running in different ways:
os . system ( str ( cmd ))
subprocess . run ( list ( cmd ))El objeto le permite especificar manualmente los argumentos FFMPEG. Los argumentos dados de esta manera tienen prioridad sobre los argumentos generados por el objeto.
from vtcff import FfmpegCommand
cmd = FfmpegCommand ()
# set arguments as string
cmd . custom . video . string = "-codec:v libx265"
cmd . custom . video . string += "-x265-params lossless=1"
# or as list
cmd . custom . video . list = [ "-codec:v" , "libx265" ]
cmd . custom . video . list . extend ([ "-x265-params" , "lossless=1" ]) El cmd.custom contiene cuatro campos, que se pueden modificar de forma independiente.
Argumentos que se insertarán antes de -i source :
custom.before_i Argumentos que se insertarán después de -i source :
custom.after_icustom.videocustom.audio ffmpeg tiene dos filtros de video para conversiones de tamaño de color y marco:
scale (libswscale) es más versátilzscale (ZIMG) ofrece una calidad más predecible Por defecto, vtcff usa zscale . A veces puede conducir a un error "no hay ruta entre los espacios de colores". Si otros métodos no ayudan, simplemente puede reemplazar zscale con scale .
cmd.use_zscale == True significa zscale se usacmd.use_zscale == False Se usa scale de medios falsos from vtcff import FfmpegCommand , Scale
cmd = FfmpegCommand ()
assert cmd . use_zscale == True # by default, it's 'zscale' (zimg)
cmd . use_zscale = False # switching to 'scale' (libswscale)
# properties affected:
cmd . scale = Scale ( 1920 , 1080 )
cmd . src_color_space = 'bt709'
cmd . dst_color_space = 'bt2020ncl'
cmd . src_range_full = True
cmd . dst_range_full = False use_zscale=True , significa que ZIMG se utilizará para conversiones establecidas explícitamente por propiedades del objeto. Esto es bueno porque estas conversiones serán de alta calidad.
Sin embargo, también se pueden requerir conversiones implícitas . Por ejemplo, antes de procesar PNG de 16 bits con zscale , necesitamos convertir el formato de píxel de rgba64be a gbrap16le . FFMPEG lo hará automáticamente con libswscale independientemente de la propiedad use_zscale .
from vtcff import FfmpegCommand , Scale , Crop
# crop 10 pixels, then scale
a = FfmpegCommand ()
a . crop = Crop ( left = 10 )
a . scale = Scale ( 1920 , 1080 )
# scale, then crop 10 pixels
b = FfmpegCommand ()
b . scale = Scale ( 1920 , 1080 )
b . crop = Crop ( left = 10 ) from vtcff import FfmpegCommand , Scale
cmd = FfmpegCommand ()
# set height to 1080, automatically compute width
cmd . scale = Scale ( - 1 , 1080 )
# set height to 1080, select the width as the closest factor
# of two to the proportional size
cmd . scale = Scale ( - 2 , 1080 ) from vtcff import FfmpegCommand
cmd = FfmpegCommand ()
# Full/Data/PC range to Limited/Video/TV
cmd . src_range_full = True
cmd . dst_range_full = False
# rec.709 to rec.2020
cmd . src_color_space = 'bt709'
cmd . dst_color_space = 'bt2020ncl' from vtcff import FfmpegCommand , Prores , ProresProfile
cmd = FfmpegCommand ()
# by default it will encode to ProRes 4:2:2
cmd . dst_codec_video = Prores ()
# encode to ProRes 4:2:2 HQ instead
cmd . dst_codec_video = Prores ( profile = ProresProfile . HQ ) from vtcff import FfmpegCommand , Hevc , VcPreset
cmd = FfmpegCommand ()
# ideal quality
cmd . dst_codec_video = Hevc ( lossless = True )
# best for bitrate quality
cmd . dst_codec_video = Hevc ( near_lossless = True , mbps = 100 )
# default quality
cmd . dst_codec_video = Hevc ( mbps = 100 )
# all modes can be tweaked with optional speed presets:
cmd . dst_codec_video = Hevc ( mbps = 100 ,
preset = VcPreset . N7_SLOW ) Por defecto, el near_lossless está configurado para más lento VcPreset.N10_PLACEBO , porque estamos tratando de maximizar la calidad. Es posible que desee elegir un preajuste más rápido para que el resultado aparezca dentro de su vida.
Por defecto, el lossless se establece en el más rápido posible VcPreset.N1_ULTRAFAST , porque no estamos perdiendo ninguna calidad aquí. El tamaño resultante será aproximadamente comparable a Prores HQ/XQ y el tiempo de codificación es razonable.
Las transmisiones de medios se pueden copiar sin volver a codificar y sin pérdida de calidad.
Sin embargo, puede haber alguna pérdida de metadatos, por ejemplo, información sobre rangos de color y espacios de color.
from vtcff import FfmpegCommand , VideoCopy , NoAudio
cmd = FfmpegCommand ()
# changing container from mp4 to mov
cmd . src_file = "source.mp4"
cmd . dst_file = "source.mov"
# keeping video, removing audio
cmd . dst_codec_video = VideoCopy ()
cmd . dst_codec_audio = NoAudio ()Convirtiendo los timelapsos o secuencias de cuadro CGI en el archivo de video Prores.
import subprocess
from vtcff import FfmpegCommand , Prores , ProresProfile
cmd = FfmpegCommand ()
# input directory will be automatically transformed
# to a pattern like '/my/dir_with_frames/img_%04.png'
cmd . src_file = '/my/dir_with_frames'
cmd . src_fps = 29.97
cmd . dst_file = '/videos/timelapse.mov'
cmd . dst_codec_video = Prores ( profile = ProresProfile . HQ )
# images usually have Full/Data/PC color range,
# but most NLEs assume that videos have Limited/Video/TV range
cmd . src_range_full = True
cmd . dst_range_full = False
# we will treat sRGB like Rec.709,
# although it's a little sad
cmd . src_color_space = 'bt709'
cmd . dst_color_space = 'bt709'
# run command
subprocess . check_call ( list ( cmd ))