Russischsprachigen Entwicklern gibt es immer etwas zu erzählen: einzigartige Erfahrungen und Meinungen auszutauschen. Aber im Format des Videoblogs tun es aufgrund der hohen Komplexität der Aufnahme derzeit nur wenige.
Unter der Katze sprach er über seinen schwierigen Weg, Videos mit freier Software, Ruby-Skripten und improvisierten Tools aufzunehmen und zu bearbeiten.
Theorie
Ich begann mit dem Studium der Theorie der Aufzeichnung von Videoblogs auf englischsprachigen YouTube-Videos. Aus russischsprachigen Materialien erwies sich dieser Kurs als sehr nützlich (insbesondere das Modul zum Bloggen von Videos und das erste Video zum Erstellen eines Frames aus dem Modul zum Berichten). Ich habe mich auch fließend mit den beliebten Funktionen proprietärer Video-Editoren vertraut gemacht, um die Wahl eines kostenlosen Editors bewusster zu gestalten.
Ich habe es nicht gewagt, in Licht zu investieren: Es gibt nicht genug Zeit, um es zu studieren und nach der besten Option zu suchen, und eine oberflächliche Untersuchung billiger Optionen spricht von potenziellen Rechen wie Flimmern und schlechter Farbwiedergabe. Bei Tageslicht hatte ich keine großen Schwierigkeiten, es reicht nur für kurze Videos.
Video-Editor
Die vorhandenen kostenlosen Videobearbeitungswerkzeuge enthalten eine Reihe bekannter Probleme: von erfolglosen Lösungen in der Benutzeroberfläche und Einfrierungen, die die Bearbeitung in unendlich verwandeln, bis hin zu Speicherlecks, Abstürzen und unerwarteten Artefakten, die erst nach dem endgültigen Rendern auftreten.
Es gibt viele Probleme und es hat einige Zeit gedauert, einen Video-Editor auszuwählen und seine Fehler zu untersuchen, um zu lernen, wie man mit grundlegenden Dingen umgeht. Letztendlich hielt er in Pitivi an , einfach weil er so viel Zeit damit verbracht hatte zu suchen und zu experimentieren.
Sound von Flatpak
Die unterstützte Installationsmethode für Pitivi erfordert Flatpak. Für eine Weile ging ich um ihn herum, weil Ich habe nicht systemd und PulseAudio in meinem System.
Es stellt sich heraus, dass systemd schon lange nicht mehr benötigt wurde. Nun, PulseAudio - ich musste installieren und konfigurieren, es war einfacher, Flatpak zu modifizieren . Aber es wäre richtiger, PulseAudio zu verwenden, es ist nur ein wenig langweilig und es ist nicht klar, ob man Probleme mit der Tonaufnahme auf vorhandener Hardware erwarten kann oder nicht.
Installieren Sie Pitivi, löschen Sie PulseAudio-Konfigurationen und führen Sie Folgendes aus:
$ sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo $ sudo flatpak install flathub org.pitivi.Pitivi $ sudo find {/var/lib,~/.local/share}/flatpak/runtime -type f -name '*pulseaudio*.conf' -delete $ flatpak run --device=alsa --branch=stable --arch=x86_64 --command=pitivi org.pitivi.Pitivi
Es ist kein Ton zu hören. Lassen Sie uns versuchen, etwas Einfacheres auszuführen, zum Beispiel aplay
:
$ sudo find /var/lib/flatpak/app/org.pitivi.Pitivi/x86_64 -type d -path '*/files/bin' -exec cp `which aplay` {} \; $ flatpak run --device=alsa --branch=stable --arch=x86_64 --command=aplay org.pitivi.Pitivi /dev/urandom ALSA lib dlmisc.c:162:(snd_dlsym_verify) unable to verify version for symbol _snd_pcm_empty_open ALSA lib dlmisc.c:283:(snd1_dlobj_cache_get) symbol _snd_pcm_empty_open is not defined inside [builtin] aplay: main:828: audio open error: No such device or address
Wahrscheinlich wurde alsa-lib
in Flatpak mit --with-versioned
kompiliert. Eine schnelle Lösung besteht darin, libasound.so
System 1 zu ersetzen:
$ sudo find /var/lib/flatpak -type f -name libasound.so.2.0.0 -exec cp /usr/lib64/libasound.so.2.0.0 {} \; $ find ~/.local/share/flatpak -type f -name libasound.so.2.0.0 -exec cp /usr/lib64/libasound.so.2.0.0 {} \;
Für mich war das nicht genug:
$ flatpak run --device=alsa --branch=stable --arch=x86_64 --command=aplay org.pitivi.Pitivi /dev/urandom ALSA lib /var/tmp/portage/media-libs/alsa-lib-1.1.6-r1/work/alsa-lib-1.1.6/src/pcm/pcm_direct.c:1943:(snd1_pcm_direct_parse_open_conf) The field ipc_gid must be a valid group (create group audio) aplay: main:828: audio open error: Invalid argument
Benötigen Sie eine andere ALSA-Konfiguration:
$ sudo find /var/lib/flatpak -type d -name etc -exec cp /etc/asound.conf {} \; $ find ~/.local/share/flatpak -type d -name etc -exec cp /etc/asound.conf {} \;
Schließlich können Sie Pitivi verwenden.
Darstellende Rendering-Einstellungen für Pitivi- Containerformat: MP4
- Video
- Codec x264enc
- fortgeschritten
- Codierungspass / -typ: konstanter Quantisierer
- konstanter Quantisierer: 18
- Bitrate: 16384 kbit / s
- Geschwindigkeitsqualität voreingestellt: ultraschnell
- Voreinstellung für psychovisuelles Tuning: Film
- Audio
- Auf eigenes Risiko und aus Angst verwende ich "Niemals aus Proxy-Dateien rendern".
- alles andere ist die Standardeinstellung
Andere Effekte
Ich mache einige Animationseffekte für den Text mit dem Screencast der Vollbildseiten, der mit enthüllen.js und animate.css angelegt wurde. In enthüllen.js für einige Folien füge ich einen Übergangston hinzu:
<section style="font-size: 5em"> <audio data-autoplay src="/path/to/sound.wav"></audio> #1 </section>
Es stellte sich als wichtig heraus, einen Screencast mit 60 FPS aufzunehmen, wenn der Text sehr groß ist. Screencast mach das:
In meinem Fall ist shared_input_loopback
das Gerät aus der Konfiguration asound.conf .
Trotzdem war dieses Add- On über ffmpeg
für Übergänge zwischen Clips nützlich.
Videoaufnahme
Zur Hand war ein Meizu MX4-Telefon, auf dem ich mich entschied, eine Frontkamera zu verwenden und mit Open Camera aufzunehmen. Es dauerte einige Zeit, bis Sie sich darin geschult hatten, in die Kamera zu schauen und Ihre Position im Weltraum zu kontrollieren, ohne typische Fehler wie das Abschneiden des Kopfes zu machen. Sprechen Sie gleichzeitig ganz klar, laut, gestikulieren Sie und erzeugen Sie zumindest eine Art Gesichtsausdruck. Das war aber nur der Anfang.
Was hat mich dazu veranlasst, automatisch Videos zu schneiden, und zwar bereits in der Aufnahmephase?
- Pitivi bremst und bugs beim Bearbeiten, insbesondere bei Verwendung des Ripple Move / Edit- Werkzeugs, was dazu führt, dass Pitivi regelmäßig neu gestartet werden muss.
- Für mich ist das manuelle Schneiden von Videos eines der langweiligsten Dinge. Es ist klar, dass eine vollständige Automatisierung nicht sehr gut möglich ist (zumindest ohne ein Szenario, in dem die zum Verständnis des Gesagten erforderlichen Pausen nicht explizit angegeben sind), aber zumindest kann dieser Prozess optimiert werden.
Hier sind die Anforderungen für das zukünftige Fahrrad, das ich mir selbst gestellt habe:
- Nehmen Sie Video mit einem Android-Telefon und Audio mit einem Laptop auf.
- Kamerafokussteuerung.
- Möglichkeit, die Aufnahme zu stoppen, um das zuletzt aufgenommene Fragment zu speichern oder zu löschen.
- Laden Sie das Video mit wiederholten Versuchen über USB vom Telefon herunter und setzen Sie es fort, ohne die Möglichkeit zu blockieren, das nächste Fragment aufzunehmen.
- Sound- Synchronisation .
- Feststellung des Vorhandenseins von Stimme und Pausen.
- Die Möglichkeit, die zuletzt aufgenommenen Videoclips mit bereits angehaltenen Pausen schnell abzuspielen.
Warum so viel Kontrolle über die Geräte während der Aufnahmephase? Warum nicht einfach mehrere Stunden hintereinander mit der Aufnahme beginnen und sie dann bearbeiten? Es gibt viele Gründe:
- Banaler Mangel an Speicherplatz.
- Die Tendenz des Telefons, sich bei längerer Aufnahme zu überhitzen und schnell zu entladen.
- Fehlfunktion des Touchscreens aufgrund des Telefons im Wasser. Aber irgendwie muss man den Fokus kontrollieren. Ja, und das nächste Drücken würde unnötige Vibrationen des Geräts verursachen.
- Probleme beim Hochladen großer Dateien aufgrund der schlechten Stromversorgung des USB-Anschlusses auf meinem Laptop. Theoretisch kann dies mit einem USB-Hub mit zusätzlicher Leistung gelöst werden. Die Verwendung eines Netzwerks ist zu langsam.
- Der Wunsch, die zuletzt aufgezeichneten Fragmente schnell zu überprüfen, um sicherzustellen, dass keine Fehler vorliegen, und sie schnell neu zu schreiben, bevor sich der Planet an der falschen Stelle vor der Sonne dreht.
- Der Wunsch, offensichtlich schlechte Duplikate so früh wie möglich zu werfen, um in Zukunft keine Zeit und keinen Speicherplatz mehr zu verschwenden.
- Sie müssen lange Audiodaten synchronisieren, die von Telefon und Laptop aufgezeichnet wurden. Dies kann zu einer Nichtübereinstimmung mit dem Video führen, da die Frames der Audiostreams sowohl beim Aufnehmen von einem Laptop als auch beim Aufnehmen von einem Telefon ausgeworfen werden (was Sie wahrscheinlich irgendwie lösen können, aber nicht riskieren und Zeit mit Experimentieren verschwenden möchten). Es ist einfacher, kleine Fragmente separat zu synchronisieren, dann ist eine mögliche Desynchronisierung nicht erkennbar.
- Die Notwendigkeit, eine Situation zu bewältigen, in der Open Camera die Aufnahme aufgrund einer Videogröße von 4 GiB neu startet. Sie müssten wahrscheinlich Open Camera ändern. Wenn diese Einschränkung auf 4 GiB nicht aufgehoben oder erhöht werden kann, müssen Sie ein Ereignis auf den Laptop werfen, um festzustellen, dass die Aufzeichnung an dieser Stelle neu gestartet wurde.
Es ist einfacher, in kleinen Fragmenten aufzunehmen und alles, was möglich ist, primitiv zu automatisieren. Ruby wurde als Hauptsprache für die Entwicklung eines Fahrrads ausgewählt. Eigentlich würde ich jetzt wahrscheinlich Python wählen, aber in diesem Moment habe ich gerade Ruby gelernt und ich leite neue Sprachen für mich in solch seltsamen Experimenten.
Automatisches Video-Slicing
Informationen im Netzwerk zu diesem Thema sind nicht sehr viel. Über die Forschung erinnerten sich Stanford und Adobe später (was nicht beängstigend ist, ich brauche immer noch eine weniger ausgefeilte Lösung).
Das Schneiden erfolgt in zwei Schritten: In der Aufnahmephase - grob, in der Renderphase - genauer, mit der Möglichkeit, zu viele zugeschnittene Fragmente manuell zu korrigieren. Grobe Implementierung mit VAD von WebRTC. Genauer - mit Hilfe von Google Speech (genauer gesagt - mit Hilfe einer Modifikation des Autosub- Projekts, um Untertitel für das Video zu generieren). Ich bin mir sicher, dass es erfolgreichere Lösungen geben wird. Es hat sich als das Beste herausgestellt, was wir schnell tun konnten.
Wenn Sie so etwas mit ffmpeg
entwickeln möchten, halten Sie sich an das Prinzip, nicht zu viel in einem Aufruf von ffmpeg
zu tun. Erstellen Sie Zwischendateien und steuern Sie jeden Schritt, damit Sie nicht nach seltsamen Nicht-Google-Fehlern suchen müssen, z. B. nach falschem Schneiden oder nicht angewendetem Effekt.
Ich beginne die daraus resultierende Schande irgendwie so:
$ bin/vlog-recorder \ --project /path/to/project \ --debug true \ --sound-settings ' --device=usb_card --format=dat' # arecord r - (RE)START recording s - STOP and SAVE current clip S - STOP and SAVE current clip, don't use auto trimming d - STOP and DELETE current clip p - PLAY last saved clip f - FOCUS camera on center h - show HELP q / Ctrl+C - QUIT [ stopped ] [ battery: 100% / 36°C ]
Ich brauche die Argumente zu arecord
, um das Gerät explizit anzugeben, um die periodischen Störungen zu vermeiden, die höchstwahrscheinlich auf das ALSA-basierte dsnoop-Plugin zurückzuführen sind. Sie können das Protokoll auch öffnen, um den Vorgang des Herunterladens von Dateien vom Telefon zu steuern: tail -f /path/to/project/log.txt
.
Sie können Folgendes schnell in einem Video zur Vorschau rendern:
$ bin/vlog-render \ --project /path/to/project \ --language ru \ --video-filters 'hqdn3d,hflip,curves=psfile=/path/to/curves.acv,vignette' \ --speed 1.3 \ --fps 60 \ --preview true
Das Argument --video-filters
sind die Filter, die an ffmpeg
. Das Video wird automatisch im mpv
Player mpv
.
Sie können die verbleibenden unnötigen Duplikate auch /path/to/project/render.conf
oder wegwerfen, indem Sie die /path/to/project/render.conf
Datei /path/to/project/render.conf
, die dank der erkannten Stimme erkannt werden kann. Die Idee ist übrigens nicht neu . Dort können Sie einzelne Fragmente beschleunigen und gegebenenfalls erfolglose Videoschnitte bearbeiten. Beim nächsten Mal liest render.conf
vlog-render
render.conf
und render.conf
die Änderungen.
Um Fragmente für einen Video-Editor vorzubereiten, müssen Sie --preview false
angeben. Zusätzlich zu den Fragmenten, die in der output
liegen, werden sie dennoch in einer output.mp4
Datei zusammengeführt, da ich anfangs nicht sicher war:
- werde ich kleine Clips in Pitivi verwenden
- oder laden Sie ein langes Video hoch, um es weiter zu schneiden (damit Sie eine Reihe von Effekten auf die „Gruppe“ von Clips anwenden können).
Ich benutze hauptsächlich die erste Option. Das zweite war in einem Video mit schlechtem Licht nützlich: Dort habe ich nur ein Stück output.mp4
. Für die zweite Option kann auch das Skript vlog-play-segments
nützlich sein: Mit ihm können Sie schnell alle Pausen zwischen Clips in absteigender Reihenfolge der Dauer anzeigen. Dies hilft render.conf
genauer zu render.conf
und später beim Bearbeiten dieses langen Videos in Pitivi Zeit zu sparen.
Die resultierenden kleinen Clips können einmal pro Timeline in Pitivi heruntergeladen werden: Wählen Sie alle importierten Clips aus und ziehen Sie sie per Drag & Drop.
Telefonhalterung
Ich wollte nicht nach einem geeigneten Telefonständer suchen, und meine Hände kratzten bereits an meinem Gesicht, um zumindest etwas aufzunehmen. Wir nehmen ein Stück Pappe zur Hand und schneiden die Telefonhalterung für unsere Bedürfnisse aus:
Der Ständer ist auf einem Laptop-Display montiert, um den Abstand zwischen dem Skript und der Kamera zu minimieren.
Tonaufnahme
Akzeptabler Klang ist sehr kritisch . Zur Hand war ein Boya BY-M1 Mikrofon. Obwohl es als omnidirektionales Mikrofon beworben wird, wird in der Praxis nur dann ein guter Klang erzielt, wenn Sie es als unidirektional verwenden.
Es ist noch einfacher, das Mikrofon zum Stehen zu bringen: Wir nehmen eine Flasche Granatapfelsaft, die zur Hand kommt, eine Rolle Klebeband und setzen diesen Konstruktor zusammen:
Sie können auch ein Handtuch unter dieses Design legen, um einen Teil der Vibrationen vom Tisch zu unterdrücken und gleichzeitig die Höhe anzupassen.
Soundkarte
In meinem Fall ist dies ASUS Xonar U3. Es stellte sich jedoch heraus, dass es mit einem solchen Mikrofon nicht kompatibel ist: Das Mikrofon verfügt über einen CTIA- Stecker für Telefone. Das Problem wurde durch den Adapter in den TRS-Steckern für Mikrofon und Kopfhörer gelöst. Und es war nicht einfach zu finden: Hersteller solcher Adapter schreiben selten Details. In meinem Fall hat ein Cablexpert CCA-418W geholfen.
Ein weiteres Problem mit dieser Karte ist der DC-Offset im rechten Kanal bei der Aufnahme. Was nicht stört, weil Ich nehme sowieso in Mono auf. Und für Software, mit der Sie kein Mono einstellen können, habe ich mit ALSA einen guten Kanal auf einen schlechten Kanal umgeleitet .
Diese Karte hat auch Angst vor Überhitzung. Sie müssen es vom Kühler fernhalten, da es sonst langsamer wird und den Ton in Rucken aufzeichnet.
Tonverarbeitung
Ich bearbeite den Ton in den Kopfhörern (in meinem Fall ist es der Pioneer SE-M390) mit einer höheren Lautstärke als der, auf der ich normalerweise Musik höre. Der Algorithmus ist ungefähr so:
- Mit Pitivi rendere ich den Sound separat (mit allen gleichen ALAC und MP4). Oft mache ich mehrere separate Spuren, wähle bestimmte Ebenen in Pitivi aus und entferne vorübergehend unnötige.
- Wenn die empfangenen Dateien sofort in Audacity hochgeladen werden, verlieren wir das Dehnen / Komprimieren des Audiostreams, was dazu führen kann, dass Video und Audio nicht mehr synchron sind. Was nicht offensichtlich ist, passiert nicht bei allen Videos. Um dies zu verhindern, wenden Sie einfach diese Dehnung / Komprimierung an:
ffmpeg -async 1 -i input.mp4 output.flac
- Laden Sie alle Titel in Audacity herunter. Fügen Sie bei Bedarf Hintergrundmusik hinzu.
- Stellen Sie für alle Spuren die gewünschte Lautstärke mit Gain ein.
- Wenden Sie auf die Spur mit der Stimme die Effekte von Rauschunterdrückung (in meinem Fall doppelt), Kompressor und Ausgleich gemäß den Tipps aus diesem Video an .
- Wir gleichen die Lautstärke des Tracks mit der Stimme aus und erhöhen sie. Eine der klassischen Möglichkeiten ist Normalisieren, Verstärken, Begrenzen und Normalisieren erneut, aber mit diesem Ansatz konnte ich noch nicht die gewünschte Klangqualität erzielen.
Ich verhalte mich vorübergehend so: Zuerst mache ich den Gain des gesamten Tracks so, dass der lauteste Teil ohne Überlastung klingt, und dann wende ich Amplify manuell für einzelne Fragmente an. Update : Eine weitere leistungsstarke Methode ist RMS Normalize, Limiter und Normal Normalize. Die Einstellungen für RMS-Normalisierung und -Begrenzer können hier übernommen werden . Trotzdem war diese Methode für mich nicht sinnvoll, weil Trotzdem habe ich mich entschlossen, mit dem eingebauten Limiter auf ein anderes Mikrofon (Zoom H1n) umzuschalten, was zu mir passt (daher muss ich mit dem neuen Mikrofon höchstwahrscheinlich nur normal normalisieren, anstatt all dieser Dinge). - Das Mikrofon nimmt manchmal Ton mit einigen Fehlern auf, die wie Klicks aussehen. Sie können mit dem Spectral Edit Multi Tool-Effekt entfernt werden. In den meisten Fällen muss der ausgewählte Bereich mehrmals hintereinander mit Strg + R angewendet werden. Update : Dank des neuen Mikrofons habe ich herausgefunden, dass diese Defekte mit etwas Äußerem zusammenhängen. Dies ist höchstwahrscheinlich eine Kombination aus Geräuschen im Mund und anderen Nebengeräuschen.
- Wir exportieren von Audacity nach FLAC und führen alles in einer Datei zusammen:
ffmpeg -i sound.flac -an -i video.mp4 -c copy output.mkv
- Zumindest das erste Video, das ich auf verschiedenen Volumes und verschiedenen Geräten getestet habe.
Ergebnis
Ich nutze die Gelegenheit, um die Nüsse in den Regeln zu lösen, und lade Sie ein, den resultierenden YouTube-Kanal zu besuchen, auf dem ich Einblicke in das effektive Studium der Programmierung und verwandter Disziplinen teile.
Viel Glück bei der Entwicklung von Programmen und der Erstellung von Videoblogs!
Update : hat diesen Artikel für seinen englischsprachigen Blog übersetzt.