2017-04-01


FFmpeg,запис на десктопа във Full HD видео със звук от микрофона

Много често използвам FFmpeg за fullscreen 📺️ прихващане и запис на десктопа Под Linux действам по следния начин записвайки в 1080p формат, без audio.
ffmpeg-capture-desktop
ffmpeg -s hd1080 -r 30 -f x11grab -thread_queue_size 1024 -i :0.0 -c:v libx264 -crf 0 -pix_fmt yuv420p -preset ultrafast OUT.mkv
Ако искам към видеото да добавя звук от микрофона включвам 🎵️ PulseAudio с подходящите аргументи. Качеството на изходните файлове е отлично.
https://ffmpeg.org/ffmpeg-devices.html#pulse
ffmpeg -s hd1080 -r 30 -f x11grab -thread_queue_size 1024 -i :0.0 -f pulse -thread_queue_size 1024 -i default -ac 2 -ar 48000 -c:v libx264 -crf 0 -pix_fmt yuv420p -preset ultrafast -c:a pcm_s16le OUT1.mkv
Задава се 🎤️ микрофонът като устройство за прихващане, иначе в изходния файл няма да бъде записан звукът.
linux-volume-control
Подобно съобщение в Linux терминала показва точно това: "output stream 0:1 0xbb9760 100 buffers queued in output stream 0:1, something may be wrong". CTRL+C прекъсва записа. В "man" страниците на ffmpeg и x264 (h264 encoder) може да се разгледа значението на флаговете: 📎️ man/1/ffmpeg
📎️ trusty/man1/x264.1.html
-s hd1080
В примера, hd1080 определя размера на прихванатото видео 1920x1080(Full HD). https://ffmpeg.org/ffmpeg-all.html#Video-size
Флагът -s и аргументът hd1080 трябва да се заместят според размера на вашия дисплей, например -video_size 1600x900.
ffmpeg -video_size 1600x900 -r 30 -f x11grab -thread_queue_size 1024 -i :0.0 -f pulse -thread_queue_size 1024 -i default -ac 2 -ar 48000 -c:v libx264 -crf 0 -pix_fmt yuv420p -preset ultrafast -c:a pcm_s16le OUT1.mkv

⏭️ Common display resolutions

-r 30
"Framerate" - frames per second (FPS) дефинира кадровата честота,количеството кадри генерирани в секунда. В този момент са въведени като цяло число(30),но могат да бъдат във формат: frame rate number/ frame rate denominator (30000/1001)=29.970 https://ffmpeg.org/ffmpeg-all.html#Video-rate
-f x11grab
fmt(force format,input/output)
https://ffmpeg.org/ffmpeg.html#Main-options
x11grab - https://www.ffmpeg.org/ffmpeg-devices.html#x11grab
Към днешна дата в Linux масово се използва 🐧️ прозоречната системата X Window, съкратено X11 или още по-кратко "X". "X" обработва само клавиатурата, мишката и изходния екран и няма нищо общо с външния вид и функциите на Linux графичните среди. Красивата визия на менютата и т.н са притежание на мениджърите на прозорци, които се изпълняват върху "X". (kwin за графичната среда KDE,metacity за Gnome,xfwm - Xfce и т.н...) X използва модела клиент/сървър, където играе ролята на сървъра, а графичните програми са клиенти. В случая се прихваща източника 0.0, където първата нула е номер на дисплей (номерирането им започват от нула). Втората 0 е номер на екран на X сървъра 🖥️ (обозначаването им също започват от нула.). Един хост може да изпълнява множество от X сървъри. Всеки X сървър може да управлява множество екрани. Ако няма правени промени по конфиг файла на X , подразбиращият се екран винаги ще бъде нула(0), така че може и да не се задава като аргумент.
-i :0.0

Обозначава пътя,адреса към източника :0.0 или само :0
.
-c:v libx264
Означава,че се използва кодек -c за видео v или -c:v - че се използва видео кодек Библиотеката libx264 кодира видео потока използвайки кодека H.264.
-crf 0
Стойностите на флага "crf" (Constant Rate Factor) (quality-based variable bitrate VBR(0-51) [23.0]) варират от 0 до 51, където 0 е без загуби,23 е стойност по подразбиране,51 е възможно най-лошия избор. Флага -crf определя битрейта и позволява на енкодера (x264) да постигне определено 🎬️ качество на изходния видео файл, за сметка на неговата големина.
http://manpages.ubuntu.com/manpages/trusty/man1/x264.1.html#contenttoc2
При по-ниско число се постига по-висока побитовата скорост (bit rate) и съответно по-високо качество. Диапазонът 18-28 е нормален за човешкото 👁️ око.Полученият видео файл ще бъде по-голям като обем, ако зададената стойност е по-малка. VBR кодирането разпределя по-висока скорост на предаване при обработка на по-сложните сегменти на мултимедийните файлове и по-нисък битрейт на по- простите сегменти. За краен резултат се взема средна стойност.В резултат на това се получава изходен файл с много добри параметри. Постоянният битрейт (cbr) ограничава качеството при по-сложните видео сегменти, където може да има приложени ефекти, transitions...
-qp 0
Обозначението със стойност 0 (нула) инструктира енкодера (x264) да съхрани видеото без загуба на качество(Lossless) с висок битрейт.Force constant QP (0-69, 0=lossless). Двете опции (-crf,-qp) са идентични.
-preset ultrafast
Чрез този флаг се определя скороста на кодиране при създаване, компресиране на изходния файл: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo, по подразбиране действа medium, не се препоръчва "placebo" По-бавното кодиране означава по-добра степен на компресия,по-малък като обем изходен файл,но в по-голяма степен се натоварва процесора.
-pix_fmts yuv420p
Използвана цветност при извеждане на видео. Категории Pixel Formats за ffmpeg:
https://wiki.multimedia.cx/index.php/Category:FFmpeg_Pixel_Formats
Следната команда позволява да се разгледат:
ffmpeg -pix_fmts
Ако не се посочи pixel format или е несъвместим с libx264, ffmpeg по подразбиране ползва yuv444p (4:4:4 8-bit) при H.264 encoding. Излиза и съобщение в терминала,което препоръчва yuv420p за по добра съвместимост. (pix_fmt yuv420p for compatibility with outdated media players)
-thread_queue_size 1024
https://ffmpeg.org/ffmpeg.html#toc-Advanced-options
Тази опция и добавената цифра след нея задава допустимо /максималния брой на чакащите пакети при четене от файл или устройство. При определена латентност голям процент от прихванатите пакети могат да бъдат игнорирани,ако те не се обработват своевременно. Повишаването на тази стойност може да го избегне. При по-слаби възможности на хардуера съм задавал 2048, намаляне на -crf 18 или 24 , -r 20,24. Латентност най общо казано е нужното време за обработката на прихванатите пакети при комуникацията между операционната система, драйверите и приложението.
-c:a pcm_s16le
Прихващане на необработено (raw audio) 🔊️ Преглед на различните формати:
https://trac.ffmpeg.org/wiki/audio%20types
ffmpeg -formats | grep PCM
-ar 48000
https://ffmpeg.org/ffmpeg.html#Audio-Options
Определя честотата на дискретизация за звука (-ar 48000=48 kHz). При изходни потоци по подразбиране се установява честота съответстваща на входния поток. За входящи потоци,тази опция има смисъл само за устройства чрез които се прихваща звук (audio grabbing devices, например звук от микрофон)
-ac 2
Задава се броят аудио канали.
За входни потоци тази опция има смисъл само за audio grabbing устройства ...
https://ffmpeg.org/ffmpeg.html#Audio-Options
За информация относно видео/аудио харектеристиките на изходящия файл може да се използва Mediainfo или данните от терминала:
mediainfo-video-audio-parameters

⏭️ ffplay static - music,video with subtitles

Пример:
Output #0, matroska, to 'OUT1.mkv': Metadata: encoder : Lavf56.40.101 Stream #0:0: Video: h264 (libx264) (H264 / 0x34363248), yuv420p, 1920x1080, q=-1--1, 30 fps, 1k tbn, 30 tbc Metadata: encoder : Lavc56.60.100 libx264 Stream #0:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, stereo, s16, 1536 kb/s Metadata: encoder : Lavc56.60.100 pcm_s16le Stream mapping: Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264)) Stream #1:0 -> #0:1 (pcm_s16le (native) -> pcm_s16le (native)) Press [q] to stop, [?] for help
Ето как евентуално може да се ползва под Windows. Всички компилации са 64-битови, статични с лиценз GPLv3. ⏭️ Изтегляне на последно изградената преносима версия
https://www.gyan.dev/ffmpeg/builds/
https://github.com/BtbN/FFmpeg-Builds/releases
Извеждане на списък с имената на наличните устройства. В отворения Windows command prompt :
ffmpeg -list_devices true -f dshow -i dummy
Ето резултата при мен:
[dshow @ 0000000000461e60] DirectShow video devices (some may be both video and audio devices) [dshow @ 0000000000461e60] "screen-capture-recorder" [dshow @ 0000000000461e60] Alternative name "@device_sw_{860BB310-5D01-11D0- BD3B-00A0C911CE86}\{4EA69364-2C8A-4AE6-A561-56E4B5044439}" [dshow @ 0000000000461e60] DirectShow audio devices [dshow @ 0000000000461e60] "Wave (ASUS Xonar DX Audio Devic" [dshow @ 0000000000461e60] Alternative name "@device_cm_{33D9A762-90C8-11D0- BD43-00A0C911CE86}\Wave (ASUS Xonar DX Audio Devic" [dshow @ 0000000000461e60] "virtual-audio-capturer" [dshow @ 0000000000461e60] Alternative name "@device_sw_{33D9A762-90C8-11D0- BD43-00A0C911CE86}\{8E146464-DB61-4309-AFA1-3578E927E935}" [dshow @ 0000000000461e60] "Aux (ASUS Xonar DX Audio Device" [dshow @ 0000000000461e60] Alternative name "@device_cm_{33D9A762-90C8-11D0- BD43-00A0C911CE86}\Aux (ASUS Xonar DX Audio Device" [dshow @ 0000000000461e60] "Line In (ASUS Xonar DX Audio De" [dshow @ 0000000000461e60] Alternative name "@device_cm_{33D9A762-90C8-11D0- BD43-00A0C911CE86}\Line In (ASUS Xonar DX Audio De" [dshow @ 0000000000461e60] "Microphone (ASUS Xonar DX Audio" [dshow @ 0000000000461e60] Alternative name "@device_cm_{33D9A762-90C8-11D0- BD43-00A0C911CE86}\Microphone (ASUS Xonar DX Audio" [dshow @ 0000000000461e60] "Stereo Mix (ASUS Xonar DX Audio" [dshow @ 0000000000461e60] Alternative name "@device_cm_{33D9A762-90C8-11D0- BD43-00A0C911CE86}\Stereo Mix (ASUS Xonar DX Audio" dummy: Immediate exit requested
От тук става ясно, че при запис с микрофон трябва да използвам: "Microphone (ASUS Xonar DX Audio", а за десктопа "screen-capture-recorder". Няколко варианта за запис:
Използване на gdigrab. Пример за прихващане само на десктопа:
ffmpeg -f gdigrab -framerate 30 -i desktop OUT2.mkv

или

ffmpeg -f gdigrab -framerate 30 -i desktop -c:v libx264 -crf 18 -preset ultrafast OUT3.mkv

Пример за запис с микрофон чрез DirectShow

ffmpeg -f dshow -thread_queue_size 2048 -i video="screen-capture-recorder":audio="Microphone (ASUS Xonar DX Audio" -c:v libx264 -preset ultrafast -pix_fmt yuv420p -c:a pcm_s16le OUT4.mkv
За повече подробности може да разгледате онлайн документацията на проекта...

https://ffmpeg.org...


Published by Nikolay Dimitrov - Saturday, April 1, 2017

Tags : audio-video grabbing , free software for capture video , FFmpeg , best Linux software ...

1 коментар :

  1. Мога ли да го използвам да прихвана картина от хардуерен "видео кепчър" и звук от HDaudio входа на звуковата карта (и да са синхронизирани)? И как да го направя?

    ОтговорИзтриване

Забележка: Само членове на този блог могат да публикуват коментари.