Редактиране на видео под Линукс

[ video  linux  ]

Съвети за редактиране на видео под Линукс

Въведение

Тук ще споделя моя опит с приложения и команди за обработка на видео под Линукс.

Docker

Docker е много удобен инструмент, когато трябва да се работи със сложни взаимовръзки между библиотеките. Препоръчителният начин за инсталация е описан на https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker ВАШИЯТ–ПОТРЕБИТЕЛ

Стабилизиране на видео

Резултатът от стабилизирането може да се види тук: половин екран, цял екран.

Плъгинът vid.stab не е компилиран стандартно в Ubuntu 18.04 и за това командите се изпълняват в докер.

Прави се на две стъпки - в първата се установява на къде е отместено (векторът на отместването) видеото във всеки един момент от време (симулира жироскоп), а на втората стъпка се променя самото видео (прилага се трансформация с обратния вектор).

  • един файл
docker run --rm  -v "$(pwd)":/data jrottenberg/ffmpeg -i /data/ВИДЕО.MP4 -vf vidstabdetect=shakiness=5:show=1:result=/data/transforms.trf -an -f null -
docker run --rm  -v "$(pwd)":/data jrottenberg/ffmpeg -i /data/ВИДЕО.MP4 -vf vidstabtransform=smoothing=20:input="/data/transforms.trf:optzoom=0" /data/РЕЗУЛТАТ.mp4
  • всички файлове в директория
#!/bin/bash
set -e
relativeFolder="${1}"
folder=$(cd "${relativeFolder}"; pwd)
for relativeFile in "${folder}"/*.MP4; do
        [ -e "${relativeFile}" ] || continue
        filename="${relativeFile##*/}"
        docker run --rm  -v "${folder}":/data jrottenberg/ffmpeg -i "/data/${filename}" -vf vidstabdetect=shakiness=5:show=1:result=/data/transforms.trf -an -f null -
        docker run --rm  -v "${folder}":/data jrottenberg/ffmpeg -i "/data/${filename}" -vf vidstabtransform=smoothing=20:input="/data/transforms.trf:optzoom=0" "/data/output-${filename}"
done
rm -rf "${folder}"/transforms.trf

sudo chown "$(whoami)":"$(whoami)" output-*.MP4
  • за ползване на GPU (добавя се :vaapi)

docker run (...) jrottenberg/ffmpeg:vaapi (...)

  • допълнителна информация: https://dashcamtalk.com/forum/threads/how-to-stabilizing-your-video.19189/
  • сравненията са генериране посредством
    • половин екран: docker run --rm -v "$(pwd)":/data jrottenberg/ffmpeg -i /data/ВИДЕО.MP4 -i /data/СЪШОТОВИДЕОВТОРИПЪТ.MP4 -filter_complex "[1]vidstabtransform=smoothing=20:input=/data/transforms.trf:optzoom=0,crop=exact=1:x=iw/2:y=0:w=iw/2:h=ih [stabilized]; [0:v:0][stabilized]overlay=main_w/2:0" /data/РЕЗУЛТАТ.mp4
    • цял екран: docker run --rm -v "$(pwd)":/data jrottenberg/ffmpeg -i /data/ВИДЕО.MP4 -i /data/СЪШОТОВИДЕОВТОРИПЪТ.MP4 -filter_complex "[1]vidstabtransform=smoothing=20:input=/data/transforms.trf:optzoom=0 [stabilized];[0:v:0]pad=iw*2:ih[original]; [original][stabilized]overlay=w" /data/РЕЗУЛТАТ.mp4
  • за съжаление тази обработка отнема доста време и за това бъдете търпеливи (може да го пуснете през нощта)

Телеметрия към видео (Picture in Picture)

Съществуват множество приложения за добавяне на телеметрични данни (локация, скорост, посока и други) към видео, но те са платени, за Windows, за конкретен модел камера или резултатът не е особено сполучлив. За това тук ще опиша един друг вариант. При него използвам gpx файл от GPS, който качвам на ayvri и записвам видеото посредством SimpleScreenRecorder. Резултатът може да видите тук: резултат, базиран на оригинално видео и телеметрия.

  • добавям gpx файла в ayvri (може и през интеграцията със страва)
  • отварям създаденото видео, преди да зареди натискам пауза, намалявам скоростта до х1, натискам STATS за да се покажат всички телеметрични данни
  • в конзолата на Chromе (Ctrl+Shift+I или F12) изпълнявам document.getElementById('StatsPanelContainer').style = "padding-right: 750px; padding-top: 337px;";document.getElementById("StatsPanelContainer").childNodes[0].childNodes[1].remove();document.getElementById("StatsPanelContainer").childNodes[0].childNodes[0].childNodes[3].remove();
  • пускам SimpleScreenRecorder, настройвам го да записва цял екран, размерите на резултатното видеото да е 0.6 от реалните размери (така или иначе го намаляваме за да се вижда само в края на екрана), избирам добро качество
  • пускам видеото на цял екран (от бутона долу-дясно)
  • избирам правилната гледна точка в ayvri така че маршрутът да е някъде в средата на екрана, пускам запис в SimpleScreenRecorder посредством Ctrl+R и натискам Play след това го спирам след края на видеото в ayvri.
  • ffmpeg -i "ВИДЕО.MP4" -i "ТЕЛЕМЕТРИЯ.mkv" -filter_complex "[1]trim=31,setpts=PTS-STARTPTS[telemetry];color=c=white,vignette=angle=PI/2:aspect=4/3:x0=w/2+30:y0=h/2-10[mask];[mask][telemetry]scale2ref[scaledmask][scaledtelemetry];[scaledtelemetry][scaledmask]alphamerge,crop=exact=1:x=0:y=ih/2:w=iw/2+245:h=ih-410[pip]; [0][pip] overlay=main_w-overlay_w:0:eof_action=endall" -acodec copy РЕЗУЛТАТ.mp4
    • в зависимост от размерите на монитора/прозореца ще трябва да промените w=iw/2+245:h=ih-410 за да позиционирате телеметрията горе-дясно
    • в зависимост от отместването във времето между телеметрията и видеото ще трябва да промените колко да изрежете от началото на телеметрията (trim=31)
    • ако искате телеметрията да избледнява повече или по-малко към краищата променете angle=PI/2:aspect=4/3:x0=w/2+30:y0=h/2-10, където PI/2 контролира колко бързо да избледнява, 4/3 - в коя посока колко да избледнява, x0=w/2+30:y0=h/2-10 от къде да започне избледняването - в случая не е от центъра и по този начин се контролира колко да е избледняло към краищата
  • допълнителна информация: https://www.oodlestechnologies.com/blogs/PICTURE-IN-PICTURE-effect-using-FFMPEG/
  • може да промените изглежда от ayvri като ползвате Chrome и натиснете с десния клавиш на мишката върху елемента и след това Inspect и изтриване/промяна на съответния HTML елемент, това може да стане и с javascript, например: document.getElementById('StatsPanelContainer').style = "padding-right: 750px; padding-top: 337px;";document.getElementById("StatsPanelContainer").childNodes[0].childNodes[1].remove();document.getElementById("StatsPanelContainer").childNodes[0].childNodes[0].childNodes[3].remove();
  • за проба може да се генерира видео с по-лошо качество, но по-бързо и по този начин да се ориентирате дали видеото и телеметрията са синхронизирани: ffmpeg -i "ВИДЕО.MP4" -i "ТЕЛЕМЕТРИЯ.mkv" -filter_complex "[1]copy [pip]; [0][pip] overlay=main_w-overlay_w:0" -profile:v main -level 3.1 -b:v 140k -ar 44100 -ab 128k -s 720x400 -vcodec h264 -acodec copy РЕЗУЛТАТ.mp4 или ffmpeg -i "ВИДЕО.MP4" -i "ТЕЛЕМЕТРИЯ.mkv" -filter_complex "[1]copy [pip]; [0][pip] overlay=main_w-overlay_w:0" -vcodec h264 -acodec copy РЕЗУЛТАТ.mp4
  • не е нужно да изчакате генерирането до край - в началото го пуснете за няколко секунди с добро качество (спира се с еднократно натискане на Ctrl+C) за да проверите дали всичко е наред (телеметрията дали е на правилното място и дали видеото е в синхрон с телеметрията)

  • за съжаление тази обработка отнема доста време и за това бъдете търпеливи (може да го пуснете през нощта)

Телеметрия и стабилизиране

Двете неща в една команда:

docker run --rm  -v "$(pwd)":/data jrottenberg/ffmpeg -i /data/ВИДЕО.MP4 -vf vidstabdetect=shakiness=5:show=1:result=/data/transforms.trf -an -f null -
docker run --rm  -v "$(pwd)":/data jrottenberg/ffmpeg -i "/data/ВИДЕО.MP4" -i "/data/ТЕЛЕМЕТРИЯ.mkv" -filter_complex "[0]vidstabtransform=smoothing=20:input=/data/transforms.trf:optzoom=0 [stabilized];[1]trim=31,setpts=PTS-STARTPTS[telemetry];color=c=white,vignette=angle=PI/2:aspect=4/3:x0=w/2+30:y0=h/2-10[mask];[mask][telemetry]scale2ref[scaledmask][scaledtelemetry];[scaledtelemetry][scaledmask]alphamerge,crop=exact=1:x=0:y=ih/2:w=iw/2+245:h=ih-410[pip]; [stabilized][pip] overlay=main_w-overlay_w:0:eof_action=endall" -vcodec h264 -acodec copy /data/РЕЗУЛТАТ.mp4
  • за съжаление тази обработка отнема доста време и за това бъдете търпеливи (може да го пуснете през нощта)

Сваляне на видео от youtube

  • docker run -it --rm -v "$(pwd):/data" vimagick/youtube-dl -i -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]' -i --audio-format=mp3 -o "%(title)s.%(ext)s" 'https://www.youtube.com/watch?v=(...)'
  • сваляне само на аудио: docker run -it --rm -v "$(pwd):/data" vimagick/youtube-dl -i -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]' -x -i --audio-format=mp3 -o "%(title)s.%(ext)s" 'https://www.youtube.com/watch?v=(...)'

  • ако не работи - обновете до най-новата версия: docker pull vimagick/youtube-dl

Забързване на видео

ffmpeg -i ВИДЕО.MP4 -filter:v "setpts=0.1*PTS" -an РЕЗУЛТАТ-fast.MP4

Графичен интерфейс

Повечето от нещата тук могат да се направят и през графични програми като kdenlive - например Overlay Video Picture in Picture и Stabilize Shaky Videos Using Kdenlive Free Editing Software, shotcut, pitivi


Натиснете бутона "watch" в github или се абонирайте с RSS четец ако искате да научавате за обновления или нови статии.

Written on November 7, 2020