Audio- und Videobearbeitung
Die Schönheit des Webs besteht darin, dass Sie Technologien kombinieren können, um neue Formen zu schaffen. Mit nativen Audio- und Videofunktionen im Browser können wir diese Datenströme mit Technologien wie <canvas>
, WebGL oder der Web Audio API verwenden, um Audio und Video direkt zu modifizieren, zum Beispiel Hall-/Kompressions-Effekte zu Audio hinzufügen oder Graustufen-/Sepia-Filter zu Video. Dieser Artikel bietet eine Referenz, um zu erklären, was Sie tun müssen.
Videobearbeitung
Die Fähigkeit, die Pixelwerte von jedem Videobild zu lesen, kann sehr nützlich sein.
Video und Canvas
Das <canvas>
-Element bietet eine Oberfläche zum Zeichnen von Grafiken auf Webseiten; es ist sehr leistungsfähig und kann eng mit Video gekoppelt werden.
Die allgemeine Technik besteht darin:
- Schreiben Sie ein Bild vom
<video>
-Element auf das<canvas>
-Element. - Lesen Sie die Daten vom
<canvas>
-Element und bearbeiten Sie sie. - Schreiben Sie die bearbeiteten Daten auf Ihr "Anzeige"-
<canvas>
(das effektiv dasselbe Element sein kann). - Pausieren Sie und wiederholen Sie den Vorgang.
Beispielsweise können wir ein Video verarbeiten, um es in Graustufen anzuzeigen. In diesem Fall zeigen wir sowohl das Quellvideo als auch die ausgegebenen Graustufenbilder an. Normalerweise, wenn Sie eine Funktion „Video in Graustufen abspielen“ implementieren würden, würden Sie wahrscheinlich display: none
zum Stil des <video>
-Elements hinzufügen, um zu verhindern, dass das Quellvideo auf dem Bildschirm gezeichnet wird, während nur das Canvas die geänderten Bilder zeigt.
HTML
Wir können unseren Videoplayer und das <canvas>
-Element wie folgt einrichten:
<video id="my-video" controls width="480" height="270" crossorigin="anonymous">
<source
src="https://jplayer.org/video/webm/Big_Buck_Bunny_Trailer.webm"
type="video/webm" />
<source
src="https://jplayer.org/video/m4v/Big_Buck_Bunny_Trailer.m4v"
type="video/mp4" />
</video>
<canvas id="my-canvas" width="480" height="270"></canvas>
JavaScript
Dieser Code bearbeitet die Bilder.
const processor = {
timerCallback() {
if (this.video.paused || this.video.ended) {
return;
}
this.computeFrame();
setTimeout(() => {
this.timerCallback();
}, 16); // roughly 60 frames per second
},
doLoad() {
this.video = document.getElementById("my-video");
this.c1 = document.getElementById("my-canvas");
this.ctx1 = this.c1.getContext("2d");
this.video.addEventListener(
"play",
() => {
this.width = this.video.width;
this.height = this.video.height;
this.timerCallback();
},
false,
);
},
computeFrame() {
this.ctx1.drawImage(this.video, 0, 0, this.width, this.height);
const frame = this.ctx1.getImageData(0, 0, this.width, this.height);
const l = frame.data.length / 4;
for (let i = 0; i < l; i++) {
const grey =
(frame.data[i * 4 + 0] +
frame.data[i * 4 + 1] +
frame.data[i * 4 + 2]) /
3;
frame.data[i * 4 + 0] = grey;
frame.data[i * 4 + 1] = grey;
frame.data[i * 4 + 2] = grey;
}
this.ctx1.putImageData(frame, 0, 0);
return;
},
};
Sobald die Seite geladen ist, können Sie aufrufen
processor.doLoad();
Ergebnis
Dies ist ein ziemlich einfaches Beispiel, das zeigt, wie man Videobilder mit einem Canvas manipuliert. Für eine effizientere Ausführung sollten Sie in Betracht ziehen, requestAnimationFrame()
anstelle von setTimeout()
zu verwenden, wenn Sie in Browsern arbeiten, die dies unterstützen.
Sie können das gleiche Ergebnis erzielen, indem Sie die grayscale()
CSS-Funktion auf das Quell <video>
-Element anwenden.
Hinweis: Aufgrund möglicher Sicherheitsprobleme, wenn Ihr Video sich auf einer anderen Domain als Ihr Code befindet, müssen Sie CORS (Cross Origin Resource Sharing) auf Ihrem Videoserver aktivieren.
Video und WebGL
WebGL ist eine leistungsfähige API, die Canvas verwendet, um hardwarebeschleunigte 3D- oder 2D-Szenen zu zeichnen. Sie können WebGL und das <video>
-Element kombinieren, um Videotexturen zu erstellen, was bedeutet, dass Sie Video in 3D-Szenen einfügen können.
Hinweis: Den Quellcode dieses Demos finden Sie auf GitHub (live ansehen ebenfalls).
Wiedergabegeschwindigkeit
Wir können auch die Geschwindigkeit anpassen, mit der Audio und Video abgespielt werden, indem wir ein Attribut des <audio>
- und <video>
-Elements namens playbackRate
verwenden. playbackRate
ist eine Zahl, die ein Vielfaches der Wiedergabegeschwindigkeit darstellt, zum Beispiel repräsentiert 0,5 die halbe Geschwindigkeit, während 2 die doppelte Geschwindigkeit repräsentiert.
Beachten Sie, dass die playbackRate
-Eigenschaft sowohl mit <audio>
als auch mit <video>
funktioniert, in beiden Fällen die Wiedergabegeschwindigkeit ändert, aber nicht die Tonhöhe. Um die Tonhöhe des Audios zu manipulieren, müssen Sie die Web Audio API verwenden. Siehe die AudioBufferSourceNode.playbackRate
Eigenschaft.
HTML
<video
id="my-video"
controls
src="https://jplayer.org/video/m4v/Big_Buck_Bunny_Trailer.m4v"></video>
JavaScript
const myVideo = document.getElementById("my-video");
myVideo.playbackRate = 2;
Editierbares Beispiel
Hinweis: Versuchen Sie das playbackRate Beispiel live.
Audiobearbeitung
Abgesehen von playbackRate
, um Audio zu manipulieren, verwenden Sie typischerweise die Web Audio API.
Eine Audioquelle auswählen
Die Web Audio API kann Audio von verschiedenen Quellen empfangen, dieses dann verarbeiten und an einen AudioDestinationNode
senden, der das Ausgabegerät repräsentiert, an das der Ton nach der Verarbeitung gesendet wird.
Wenn die Audioquelle ist … | Verwenden Sie diesen Web Audio Knoten-Typ |
---|---|
Eine Audiospur aus einem HTML <audio> - oder <video> -Element |
MediaElementAudioSourceNode |
Ein einfacher roher Audiodatenpuffer im Speicher | AudioBufferSourceNode |
Ein Oszillator, der eine Sinuswelle oder eine andere berechnete Wellenform erzeugt | OscillatorNode |
Eine Audiospur von WebRTC (wie das Mikrofoneingang, das Sie mit getUserMedia() erhalten können) |
MediaStreamAudioSourceNode |
Audiofilter
Die Web Audio API bietet viele verschiedene Filter/Effekte, die auf Audio angewendet werden können, wie zum Beispiel der BiquadFilterNode
.
HTML
<video id="my-video" controls src="my-video.mp4" type="video/mp4"></video>
JavaScript
const context = new AudioContext();
const audioSource = context.createMediaElementSource(
document.getElementById("my-video"),
);
const filter = context.createBiquadFilter();
audioSource.connect(filter);
filter.connect(context.destination);
// Configure filter
filter.type = "lowshelf";
filter.frequency.value = 1000;
filter.gain.value = 25;
Editierbares Beispiel
Hinweis: Sofern Sie nicht CORS aktiviert haben, um Sicherheitsprobleme zu vermeiden, sollte Ihr Video auf derselben Domain wie Ihr Code sein.
Allgemeine Audiofilter
Dies sind einige häufige Arten von Audiofiltern, die Sie anwenden können:
- Low Pass: Ermöglicht Frequenzen unterhalb der Grenzfrequenz und dämpft Frequenzen oberhalb der Grenzfrequenz.
- High Pass: Ermöglicht Frequenzen oberhalb der Grenzfrequenz und dämpft Frequenzen unterhalb der Grenzfrequenz.
- Band Pass: Ermöglicht einen Frequenzbereich und dämpft die Frequenzen unterhalb und oberhalb dieses Bereichs.
- Low Shelf: Ermöglicht alle Frequenzen, fügt aber einen Schub (oder Dämpfung) zu den niedrigeren Frequenzen hinzu.
- High Shelf: Ermöglicht alle Frequenzen, fügt aber einen Schub (oder Dämpfung) zu den höheren Frequenzen hinzu.
- Peaking: Ermöglicht alle Frequenzen, fügt aber einen Schub (oder Dämpfung) zu einem Frequenzbereich hinzu.
- Notch: Ermöglicht alle Frequenzen, außer für einen Satz von Frequenzen.
- All Pass: Ermöglicht alle Frequenzen, ändert jedoch die Phasenbeziehung zwischen den verschiedenen Frequenzen.
Hinweis:
Siehe BiquadFilterNode
für mehr Informationen.
Faltung und Impulse
Es ist auch möglich, Impulsantworten auf Audio mit dem ConvolverNode
anzuwenden. Eine Impulsantwort ist der Klang, der nach einem kurzen Impuls von Klang (wie einem Handklatschen) erzeugt wird. Eine Impulsantwort wird die Umgebung angeben, in der der Impuls erzeugt wurde (zum Beispiel ein Echo, das durch Klatschen in einem Tunnel entsteht).
Beispiel
const convolver = context.createConvolver();
convolver.buffer = this.impulseResponseBuffer;
// Connect the graph.
source.connect(convolver);
convolver.connect(context.destination);
Sehen Sie sich dieses CodePen für ein angewandtes (aber sehr, sehr albernes; wie, kleine Kinder werden giggeln) Beispiel an.
Räumliches Audio
Wir können Audio auch mithilfe eines Panner-Knotens positionieren. Ein Panner-Knoten—PannerNode
—erlaubt es uns, einen Quellkegel sowie Positions- und Richtungselemente zu definieren, alles im 3D-Raum, definiert durch 3D-kartesische Koordinaten.
Beispiel
const panner = context.createPanner();
panner.coneOuterGain = 0.2;
panner.coneOuterAngle = 120;
panner.coneInnerAngle = 0;
panner.connect(context.destination);
source.connect(panner);
source.start(0);
// Position the listener at the origin.
context.listener.setPosition(0, 0, 0);
Hinweis: Sie finden ein Beispiel in unserem GitHub-Repository (live ansehen ebenfalls).
JavaScript-Codecs
Es ist auch möglich, Audio auf niedrigem Niveau mit JavaScript zu manipulieren. Dies kann nützlich sein, wenn Sie eigene Audiocodecs erstellen möchten.
Bibliotheken existieren derzeit für die folgenden Formate:
Hinweis: Bei Audiocogs können Sie einige Demos ausprobieren; Audiocogs bietet auch ein Framework, Aurora.js, das Ihnen helfen soll, Ihre eigenen Codecs in JavaScript zu entwickeln.
Beispiele
Siehe auch
Leitfäden
- Manipulieren von Video mit Canvas
- HTML playbackRate erklärt
- Verwendung der Web Audio API
- Grundlagen der Web Audio-Räumlichkeit
- Verwendung von Videobildern als WebGL-Textur (Sie können auch die THREE.js WebGL-Bibliothek (und andere) verwenden, um diesen Effekt zu erzielen)
- Texturen in WebGL animieren
- Entwicklung von Spielaudio mit der Web Audio API (Raumeffekte und Filter) (2012)
Referenz
- Die
<audio>
und<video>
Elemente - Die
HTMLMediaElement
API - Das
<canvas>
-Element - Web Audio API
- AudioContext
- Weitere Informationen zu Räumlichem Audio
- Webmedien-Technologien