====== Просмотр ====== ===== Локальные файлы ===== ==== В консоли ==== 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= | vlc - ===== Извлечение кадров ===== [[https://stackoverflow.com/a/10962408 | 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). ===== Рип ===== ===== Из картинок ===== ==== Один кадр ==== [[https://stackoverflow.com/a/25895709 | 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 ==== [[http://www.openshot.org/ | OpenShot]] -- простой видеоредактор. Хорош для простого монтажа и создания видео из фрагментов видеофайлов, аудиофайлов, картинок. Графический интерфейс написан на языке Python и использует библиотеку ''PyQt''. Версии 1.X были основаны на библиотеке [[https://www.mltframework.org/ | MLT]]. Начиная с версии 2.0 используется своя собственная библиотека [[http://www.openshot.org/libopenshot/ | LibOpenShot]]. ==== Соединение роликов ==== [[https://video.stackexchange.com/a/10401 | How to concatenate clips from the same video with ffmpeg]] === Демультиплескором === Соединять видеоролики таким способом можно только при условии, что они имеют одинаковый формат: размеры кадра, кодеки, ... и т.д. Создаём файл, в котором перечислено, какие фрагменты из каких файлов необходимо соединить(([[http://ffmpeg.org/ffmpeg-formats.html#concat-1 | FFmpeg Documentation]], [[https://trac.ffmpeg.org/wiki/Concatenate | FFmpeg wiki: Concatenating media files]], [[https://ffmpeg.org/faq.html#toc-How-can-I-join-video-files_003f | FFmpeg FAQ]])): 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'', оставить только имена файлов: 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," #!/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" #!/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 === [[https://libav.org/avconv.html#libx264 | Параметры кодека 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 === Согласно [[http://libav.org/faq.html#How-do-I-encode-Xvid-or-DivX-video-with-avconv_003f | инструкции]] от разработчиков ''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 Название аудиодорожек(([[https://superuser.com/a/835069 | How do I name an audio track with ffmpeg]])): 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 ===== [[dvd|Создание Video DVD]] ====== Вещание ====== ====== Полезные ссылки ====== https://libav.org/avconv.html#libx264 https://sites.google.com/site/linuxencoding/x264-ffmpeg-mapping