Зміст

Просмотр

Локальные файлы

В консоли

mplayer -fs -zoom -vo x11 -display :0.0 /home/Clips/Dakh\ Daughters\ \ Rozy\ \ \ Donbass-IHJprqxIwdc.webm

URL

Youtube

Live streams

youtube-dl -g https://www.youtube.com/watch?v=<video_ID> | vlc -

Извлечение кадров

Fastest way to extract frames using ffmpeg?

ffmpeg -i file.mpg -r 1/1 $filename%03d.bmp

Создание

Съёмка

Захват с экрана

ffmpeg (avconv)

avconv -f x11grab -s 300x140 -r 25 -i :0.0+10,20 -an -sn -vcodec libvpx -vb 20k /tmp/out.mkv

Вырежет из экрана прямоугольник шириной 300 пикселей и высотой 140 пикселей, начиная с координат (10,20). Т.е. смещённый вправо от левого края экрана на 10 пикселей и вниз от верхнего края экрана – на 20 пикселей. При этом кодек может быть какой угодно. Однако, вероятно, стоит придерживаться того правила, что для того, чтобы придерживаться реального времени, компьютер должен успевать обрабатывать заданное число кадров в секунду. В примере выше это 25 кадров в секунду. И при высоком разрешении и относительно слабом компьютере, вероятно, стоит использовать кодек, менее требовательный к ресурсам ПК (например, XviD или даже MPEG2).

Рип

Из картинок

Один кадр

Creating a video from a single image for a specific duration in ffmpeg

ffmpeg -loop 1 -i image.png -c:v libx264 -t 15 -pix_fmt yuv420p -vf scale=320:240 out.mp4

Здесь -t 15 обозначает длительность 15 секунд, а -vf scale=320:240 устанавливает ширину и высоту кадра.

Багато кадрів

Якщо файли названо:

img001.jpg
img002.jpg
img003.jpg
...

то поєднати їх в одному відео можна наступною командою:

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" out.mp4

При цьому параметр “-r 1/5” позначає, що одне зображення триматиметься протягом 5 секунд відео. Якщо потрібно змінювати швидше, наприклад, 2 картинки на секунду відео, то можна вказати просто “-r 2”.

Обработка

Монтаж

OpenShot

OpenShot – простой видеоредактор. Хорош для простого монтажа и создания видео из фрагментов видеофайлов, аудиофайлов, картинок. Графический интерфейс написан на языке Python и использует библиотеку PyQt. Версии 1.X были основаны на библиотеке MLT. Начиная с версии 2.0 используется своя собственная библиотека LibOpenShot.

Соединение роликов

How to concatenate clips from the same video with ffmpeg

Демультиплескором

Соединять видеоролики таким способом можно только при условии, что они имеют одинаковый формат: размеры кадра, кодеки, … и т.д.

Создаём файл, в котором перечислено, какие фрагменты из каких файлов необходимо соединить1):

concat.txt
file 'part1.mkv'
 
file 'part2.mkv'
duration 00:00:04.080
inpoint 00:00:02.000
outpoint 00:00:03.000
 
file 'part3.mkv'
duration 300
inpoint 15
outpoint 25

В этом файле part1.mkv, part2.mkv и part3.mkv – видеоролики, части которых нам надо соединить. После параметра duration указывается длительность соответствующего ролика. Параметр inpoint показывает начальный момент времени, с которого нужно считывать фрагмент. Параметр outpoint показывает конечный момент времени в ролике, до которого его нужно считывать. Все эти параметры относятся к предшествующему параметру file. Соответственно, аналогичные параметры, стоящие после второго упоминания file, будут относиться уже ко второму ролику.

Как видим, время можно указывать либо в формате чч:мм:сс.мс, либо одним числом в секундах.

Другой вариант этой процедуры – сначала вырезать нужные фрагменты из каждого ролика:

ffmpeg -ss 00:00:02.000 -i video2.mkv -t 1 part2.mkv
ffmpeg -ss 15 -i video3.mkv -t 10 part3.mkv

затем опустить все параметры в файле concat.txt, оставить только имена файлов:

concat.txt
file 'part1.mkv'
file 'part2.mkv'
file 'part3.mkv'

Затем, когда файл тем или иным образом составлен, можно запустить собственно соединение:

ffmpeg -f concat -i concat.txt -codec copy output.mkv

Фильтром

Применяя фильтр concat, можно соединять даже видеоролики, бывшие в разных форматах и закодированные разными кодеками. Использовать этот фильтр удобно в комбинации с фильтром trim, который вырезает нужный фрагмент из видеоролика. Важно при этом не забыть об одновременном применении фильтра atrim, который вырезает нужный фрагмент из аудиодорожки. Как правило, вырезанные фрагменты видео и аудио должны совпадать по времени.

ffmpeg -i part1.mkv -i part2.mkv -i part1.mkv \
-filter_complex \
"[1:v]trim=start=2:end=3,setpts=PTS-STARTPTS[v1]; \
 [1:a]atrim=start=2:end=3,asetpts=PTS-STARTPTS[a1]; \
 [2:v]trim=15:25,setpts=PTS-STARTPTS[v2];
 [2:a]atrim=15:25,asetpts=PTS-STARTPTS[a2]; \
 [0:v][0:a][v1][a1][v2][a2]concat=n=3:v=1:a=1[out]" \
-map "[out]" output.mkv

Такая команда передаст первый ролик из файла part1.mkv целиком в фильтр concat, т.к. мы не применяли к нему обрезку (trim). При этом видеодорожка из этого файла обозначается [0:v], а аудиодорожка – [0:a]. Из второго входного файла part2.mkv будет вырезан фрагмент со 2й по 3ю секунды, и затем передан фильтру concat под обозначением [v1] для видео и [a1] для аудио. Из третьего файла part1.mkv будет вырезан фрагмент с 15й по 25ю секунды и тоже передан фильтру concat.

Если при вырезании фрагмента будет отсутствовать параметр start=, это обозначает, что фрагмент должен начинаться с самого начала, а если отсутствует параметр end=, это обозначает, что фрагмент должен длиться до конца.

В качестве параметров фильтру concat передаётся количество входных фрагментов (n=3), количество видеодорожек в выходном файле (v=1) и количество аудиодорожек в выходном файле (a=1).

Кодирование видео

Mencoder

XviD

time mencoder -vf yadif=0,hqdn3d=0:0:15:15,scale=360:288 -ovc xvid -xvidencopts bitrate=500:threads=2 -nosound -lavcopts acodec=libmp3lame:abitrate=64  -o /mnt/multimedia/encoded.avi /mnt/multimedia/Мой\ фильм.avi
time mencoder -vf yadif=0,hqdn3d=0:0:15:15 -ovc xvid -xvidencopts bitrate=1200:threads=2 -oac lavc -lavcopts acodec=libmp3lame:abitrate=64  -o /mnt/multimedia/encoded.avi /mnt/multimedia/Мой\ фильм.avi
  time (mencoder -dvd-device /temp/ dvd://1 -vf yadif=0,scale=704:528,dsize=4/3 -nosound -ovc xvid -xvidencopts pass=1:bitrate=1200:threads=2 -o Rojdennie_mislit-1-video.avi && mencoder -dvd-device /temp/ dvd://1 -vf yadif=0,scale=704:528,dsize=4/3 -nosound -ovc xvid -xvidencopts pass=2:bitrate=1200:threads=2 -o Rojdennie_mislit-1-video.avi)

x264

/x264-enc-2p.sh "-nosound /mnt/multimedia/Films/ToRecompress/show_32.avi" 935 "scale=576:432,dsize=4/3,"
x264-enc-2p.sh
#!/bin/bash 
# x264-enc-3p.sh
source="$1" 
bitrate="$2" 
filters="$3" 
name="$(date +%F-%T)".avi 
log="$name".log
 
# With niceness = 19 (the lowest priority
#E1="nice -n 19 mencoder "$source" -vf pullup,softskip,"$filters"harddup -ovc x264 -x264encopts threads=2:subq=1:frameref=1:bframes=3:b_pyramid=normal:direct_pred=auto:bitrate=$bitrate"
#E2="nice -n 19 mencoder "$source" -vf pullup,softskip,"$filters"harddup -ovc x264 -x264encopts threads=2:psnr:ssim:b_adapt=2:deblock:cabac:chroma_me:subq=9:partitions=all:8x8dct:me=umh:nofast_pskip:nodct_decimate:me_range=16:trellis=2:frameref=5:bframes=3:b_pyramid=normal:weight_b:mixed_refs:direct_pred=auto:bitrate=$bitrate"
 
# With niceness = 0 (normal priority)
#E1="mencoder "$source" -vf pullup,softskip,"$filters"harddup -ovc x264 -x264encopts threads=2:subq=1:frameref=1:bframes=3:b_pyramid=normal:direct_pred=auto:bitrate=$bitrate"
#E2="mencoder "$source" -vf pullup,softskip,"$filters"harddup -ovc x264 -x264encopts threads=2:psnr:ssim:b_adapt=2:deblock:cabac:chroma_me:subq=9:partitions=all:8x8dct:me=umh:nofast_pskip:nodct_decimate:me_range=16:trellis=2:frameref=5:bframes=3:b_pyramid=normal:weight_b:mixed_refs:direct_pred=auto:bitrate=$bitrate"
E1="mencoder "$source" -vf "$filters"harddup -ovc x264 -x264encopts threads=2:subq=1:frameref=1:bframes=3:b_pyramid=normal:direct_pred=auto:bitrate=$bitrate"
E2="mencoder "$source" -vf "$filters"harddup -ovc x264 -x264encopts threads=2:psnr:ssim:b_adapt=2:deblock:cabac:chroma_me:subq=9:partitions=all:8x8dct:me=umh:nofast_pskip:nodct_decimate:me_range=16:trellis=2:frameref=5:bframes=3:b_pyramid=normal:weight_b:mixed_refs:direct_pred=auto:bitrate=$bitrate"
 
 
time (\
time $E1:pass=1 -o /dev/null && \
time $E2:pass=2 -o "$name" && \
echo "Encoding time:")
 
rm -v divx2pass.log
 
 
#(time (\ 
#time $E1:pass=1 -o /dev/null && \
#time $E2:pass=2 -o "$name" && \
#echo "Encoding time:") &> "$log"; \
#)&
 
#rm -v divx2pass.log
#(time (\ 
#time $E1:pass=1 -o /dev/null && \ 
#time $E2:pass=2 -o "$name" && \ 
#echo "Encoding time:") &> "$log";\ 
#rm -v divx2pass.log*\ 
#) &
 
#(time (\ 
#time $e:pass=1 -o /dev/null && \ 
#time $e:pass=3 -o /dev/null && \ 
#time $e:pass=3 -o "$name" && \ 
#echo "Encoding time:") &> "$log";\ 
#rm -v divx2pass.log*\ 
#) &
#tail -f "$log"
x264-enc-3p.sh
#!/bin/bash 
# x264-enc-3p.sh
source="$1" 
bitrate="$2" 
filters="$3" 
name="$(date +%F-%T)".avi 
log="$name".log
# 21 
#e="mencoder "$source" -vf pullup,softskip,"$filters"harddup -ovc x264 -x264encopts threads=auto:psnr:ssim: b_adapt=2:deblock:cabac:chroma_me:subq=9:partitions=all:8x8dct:me=umh:nofast_pskip:nodct_decimate: me_range=32:trellis=2:frameref=16:bframes=16:b_pyramid:weight_b:mixed_refs:direct_pred=auto: keyint=750:keyint_min=25:direct_8x8=-1:aq_mode=1:aq_strength=1.0:psy_rd=1.0,0.0:bitrate=$bitrate"(
#e="mencoder "$source" -vf pullup,softskip,"$filters"harddup -ovc x264 -x264encopts threads=2:psnr:ssim:b_adapt=2:deblock:cabac:chroma_me:subq=9:partitions=all:8x8dct:me=umh:nofast_pskip:nodct_decimate:me_range=32:trellis=2:frameref=16:bframes=16:b_pyramid:weight_b:mixed_refs:direct_pred=auto:keyint=750:keyint_min=25:direct_8x8=-1:aq_mode=1:aq_strength=1.0:psy_rd=1.0,0.0:bitrate=$bitrate"
 
# With niceness = 19 (the lowest priority
#E1="nice -n 19 mencoder "$source" -vf pullup,softskip,"$filters"harddup -ovc x264 -x264encopts threads=2:subq=1:frameref=1:bframes=3:b_pyramid=normal:direct_pred=auto:bitrate=$bitrate"
#E2="nice -n 19 mencoder "$source" -vf pullup,softskip,"$filters"harddup -ovc x264 -x264encopts threads=2:psnr:ssim:b_adapt=2:deblock:cabac:chroma_me:subq=9:partitions=all:8x8dct:me=umh:nofast_pskip:nodct_decimate:me_range=16:trellis=2:frameref=5:bframes=3:b_pyramid=normal:weight_b:mixed_refs:direct_pred=auto:bitrate=$bitrate"
 
# With niceness = 0 (normal priority)
E1="mencoder "$source" -vf pullup,softskip,"$filters"harddup -ovc x264 -x264encopts threads=2:subq=1:frameref=1:bframes=3:b_pyramid=normal:direct_pred=auto:bitrate=$bitrate"
E2="mencoder "$source" -vf pullup,softskip,"$filters"harddup -ovc x264 -x264encopts threads=2:psnr:ssim:b_adapt=2:deblock:cabac:chroma_me:subq=9:partitions=all:8x8dct:me=umh:nofast_pskip:nodct_decimate:me_range=16:trellis=2:frameref=5:bframes=3:b_pyramid=normal:weight_b:mixed_refs:direct_pred=auto:bitrate=$bitrate"
 
#E2="mencoder "$source" -vf pullup,softskip,"$filters"harddup -ovc x264 -x264encopts threads=2:psnr:ssim: b_adapt=2:deblock:cabac:chroma_me:subq=6:partitions=all:8x8dct:me=umh:nofast_pskip:nodct_decimate:me_range=32:trellis=2:frameref=5:bframes=3:b_pyramid:weight_b:mixed_refs:direct_pred=auto:keyint=750:keyint_min=25:direct_8x8=-1:aq_mode=1:aq_strength=1.0:psy_rd=1.0,0.0:bitrate=$bitrate"
#E2="mencoder "$source" -vf pullup,softskip,"$filters"harddup -ovc x264 -x264encopts threads=2:subq=1:frameref=1:bframes=3:b_pyramid=normal:direct_pred=auto:bitrate=$bitrate"
 
 
time (\ 
time $E1:pass=1 -o /dev/null && \
time $E2:pass=2 -o "$name" && \
echo "Encoding time:")
 
rm -v divx2pass.log
 
 
#(time (\ 
#time $E1:pass=1 -o /dev/null && \
#time $E2:pass=2 -o "$name" && \
#echo "Encoding time:") &> "$log"; \
#)&
 
#rm -v divx2pass.log
#(time (\ 
#time $E1:pass=1 -o /dev/null && \ 
#time $E2:pass=2 -o "$name" && \ 
#echo "Encoding time:") &> "$log";\ 
#rm -v divx2pass.log*\ 
#) &
 
#(time (\ 
#time $e:pass=1 -o /dev/null && \ 
#time $e:pass=3 -o /dev/null && \ 
#time $e:pass=3 -o "$name" && \ 
#echo "Encoding time:") &> "$log";\ 
#rm -v divx2pass.log*\ 
#) &
#tail -f "$log"

FFMpeg (avconv)

avconv [global options] [[infile options][-i infile]]... {[outfile options] outfile}...

VP8

avconv -i input_movie.mp4 -vcodec libvpx -vb 20k -r 25 -s 320x180 -pass 1 -an -sn -y output_movie-20k.mkv
avconv -i input_movie.mp4 -vcodec libvpx -vb 20k -r 25 -s 320x180 -pass 2 -acodec libvorbis -ac 1 -aq 0 -sn -y output_movie-20k.mkv

x264

Параметры кодека x264

  avconv -ss 60 -i input_movie.avi -vf hqdn3d=10:10:10:10 -vcodec libx264 -vb 2800k -r 30 -acodec libvorbis -ac 1 -aq -1 -sn -t 10 -y output_movie-denoise-2800.mkv

В приведённом примере происходит перекодирование видео с 60-й по 70-ю секунды видеокодеком x264 с потоком видео в 2800 кбит/с, частотой кадров 30 кадров/с и аудиокодеком Vorbis с качеством “-1”.

-ss 60 – перемотка на 60-ю секунду исходного видеофайла

-vf hqdn3d=10:10:10:10 – использование видеофильтра hqdn3d для подавления шумов; объяснение параметров ниже

-vcodec libx264 – использование библиотеки libx264 для кодирования видео

-vb 2800k – видеопоток 2800 кбит/с

-r 30 – частота кадров 30 кадров/с

-acodec libvorbis – использование библиотеки libvorbis для кодирования аудио

-ac 1 – количество каналов в звуковой дорожке; в данном случае – 1 канал

-aq -1 – качество кодирования Vorbis; в данном случае “-1”

-sn – нет субтитров

-t 10 – длительность результирующего видео; в данном случае – 10 секунд

XviD

Согласно инструкции от разработчиков libav, для кодирования видео кодеком XviD нужно указывать параметр -c:v mpeg4. При этом значение параметра fourcc в конечном файле по умолчанию будет выставлено в FMP4. Чтобы изменить это значение, можно воспользоваться параметром -vtag и указать любое значение. Например, -vtag xvid.

avconv -i input_film.VOB -vtag xvid -c:v mpeg4 -b:v 1000k -r 25 -pass 1 -an -sn -y output_movie-1000k.mkv
avconv -i input_film.VOB -vtag xvid -c:v mpeg4 -b:v 1000k -r 25 -pass 2 -acodec libvorbis -aq 1 -ac 2 -sn -y output_movie-1000k.mkv

Кодирование аудио

mplayer -dvd-device /mnt/cdrom/ mplayer dvd://1 -vc null -vo null -ao pcm:file=audio.fifo:waveheader:fast
oggenc -o Rojdennie_mislit-1-audio.ogg -q2 audio.fifo

Фильтры

Видеофильтры

Изменение размера

mplayer -vf crop=620:432:10:0,scale=576:432,dsize=4/3 -nosound /mnt/multimedia/Films/ToRecompress/show_22.avi
mplayer -vf scale=576:432,dsize=4/3 -nosound /mnt/multimedia/Films/ToRecompress/show_26.avi
mplayer -vf scale=576:432,dsize=4/3 -endpos 1497 -nosound /mnt/multimedia/Films/ToRecompress/show_33_34.avi

Обрезка краёв

mplayer -vf crop=624:480:16:0,scale=576:432,dsize=4/3 -ss 1497 -nosound /mnt/multimedia/Films/ToRecompress/show_33_34.avi
mplayer -vf crop=624:480:16:0,scale=576:432,dsize=4/3 -nosound /mnt/multimedia/Films/ToRecompress/show_35.avi

Подавление шумов

mplayer -ss 510 -vf hqdn3d=0:0:15:15 -ao null dvd://2 -dvd-device /mnt/lan/data/Родина\ или\ смерть\!\ \(Фидель\ Кастро\)/

Добавление чёрных полос

Аудиофильтры

Выпуск

Мультиплексирование

mkvmerge -o Rojdennie_mislit-1.mkv Rojdennie_mislit-1-video.avi -y 0:250 Rojdennie_mislit-1-audio.ogg
mkvmerge -o Patria.mkv 2010-05-23-01\:13\:27.avi -y 0:0 /mnt/data/Patria_o_muerte.ogg
mkvmerge -o show_31.mkv 2010-05-23-07\:37\:34.avi -y 0:400 show_31.ogg

Объединение видеодорожки из файла Video.mkv и аудиодорожки из файла Separate_audio.ogg без перекодирования:

ffmpeg -i Video.mkv -i Separate_audio.ogg -map 0:v -map 1:a -сodec copy ResultVideo.mkv

То же самое, с перекодированием только аудиодорожки:

ffmpeg -i Video.mkv -i separate_audio.wav -map 0:v -map 1:a -vcodec copy -acodec libvorbis -q 3 ResultVideo.mkv

Название аудиодорожек2):

ffmpeg -i Video.mkv -i audio1.ogg -i audio2.ogg -map 0:v -map 1:a -map 2:a -codec copy -metadata:s:a:0 title="Звуковая дорожка 1" -metadata:s:a:1 title="Звуковая дорожка 2" ResultVideo.mkv

Создание DVD

Создание Video DVD

Вещание

Полезные ссылки

https://libav.org/avconv.html#libx264 https://sites.google.com/site/linuxencoding/x264-ffmpeg-mapping