Tonhöhe des aufgenommenen Clips ändern (m4v)

8

Ich schreibe eine App, in der ich versuche, die Tonhöhe des Tons zu ändern, wenn ich einen Film aufnehme (.m4v). Oder indem Sie die Tonhöhe des Films nachträglich ändern. Ich möchte, dass das Endergebnis ein Film (.m4v) ist, der die ursprüngliche Länge (d. H. Das gleiche Bild wie das Original) aufweist, aber mit einer modifizierten Tonhöhe, z. eine "Chipmunk-Stimme". Eine Echtzeitkonvertierung soll möglichst vorgezogen werden.

Ich habe viel über das Ändern der Tonhöhe in iOS gelesen, aber die meisten Beispiele konzentrieren sich auf die Wiedergabe, d. h. auf den Ton mit einer anderen Tonhöhe.

In meiner App nehme ich einen Film (.m4v / AVFileTypeQuickTimeMovie) auf und speichere ihn mit dem Standard AVAssetWriter. Beim Speichern des Films habe ich Zugriff auf die folgenden Elemente, wo ich versucht habe, den Ton zu manipulieren (z. B. die Tonhöhe zu ändern):

  • Audiopuffer (CMSampleBufferRef)
  • Audioeingabe-Schreiber (AVAssetWriterAudioInput)
  • Audio-Eingabe-Writer-Optionen (z. B. AVNumberOfChannelsKey, AVSampleRateKey, AVChannelLayoutKey)
  • Anlagenschreiber (AVAssetWriter)

Ich habe versucht, die oben genannten Objekte anzuhängen, um die Tonhöhe zu ändern, aber ohne Erfolg.

Ich habe auch mit Dirac versucht, wie hier beschrieben: Real Time Pitch Change In iPhone mit Dirac Und OpenAL mit AL_PITCH wie hier beschrieben: Piping-Ausgabe von OpenAL in einen Puffer
Und die "BASS" -Bibliothek von un4seen: Pitch / Tempo in Echtzeit ändern

Ich habe mit keiner der oben genannten Bibliotheken Erfolg gehabt, wahrscheinlich weil ich nicht weiß, wie ich sie verwenden soll und wo ich sie in den Audiospeichercode einbinden kann.

Es scheint eine Menge von Librarys zu geben, die ähnliche Effekte haben, sich aber auf die Wiedergabe oder benutzerdefinierten Aufnahmecode konzentrieren. Ich möchte den bereits vorhandenen Audio-Stream (AVAssetWriterAudioInput) bearbeiten oder den gespeicherten Movieclip (.m4v) ändern. Ich möchte, dass das Video visuell nicht geändert wird, d. H. Mit der gleichen Geschwindigkeit wiedergegeben wird. Aber ich möchte, dass der Ton schneller (wie ein Streifenhörnchen) oder langsamer (wie ein ... Monster?) Wird

Haben Sie irgendwelche Vorschläge, wie ich die Tonhöhe entweder in Echtzeit (beim Aufnehmen des Films) oder danach durch Konvertieren des gesamten Films (.m4v-Datei) ändern kann? Soll ich Dirac, OpenAL, SoundTouch, BASS oder eine andere Bibliothek näher betrachten?

Ich möchte den Film mit modifiziertem Audio für andere freigeben können, deshalb kann ich mich nicht darauf verlassen, die Tonhöhe nur für die Wiedergabe zu ändern.

    
mikeesouth 11.06.2012, 22:36
quelle

2 Antworten

3

Okay, ich kann mit Sicherheit sagen, dass Dirac definitiv den Trick machen wird. Ich habe es benutzt und es funktioniert.

Ich habe wenig Erfahrung mit der Videoverarbeitung, aber wenn Sie die Audiospur irgendwann isolieren können, ist das ein Kinderspiel.

  1. Wenn Sie das tun können, dann speichern Sie es einfach in eine Datei und verwenden Sie den Beispielcode von dirac im Time Stretching, es sagt nichts, aber es tut auch Pitch Shifting, Sie setzen drei Parameter um Ihr Audio zu transformieren (Zeit Streckungsfaktor, Tonhöhenverschiebung in Cents / Tönen * und auch Formant Shift).

  2. Wenn Sie es nicht in einer Datei speichern möchten, dann konvertieren Sie es einfach in PCM und machen Sie etwas DSP auf Audio Units. um ehrlich zu sein, benötigt man einige ernsthafte Kenntnisse über Mathematik und Audioverarbeitung, um das zu tun, aber es gibt eine Menge guter Beispielprojekte (github (AudioGraph von Tom Zic)), die Sie mit dem versorgen, was Sie brauchen, vergessen Sie nicht Erwähnen Sie all diese Entwickler-Codes für Ihre Arbeit.

Wenn Sie zu PCM transformieren können, können Sie in diesem Stadium alternativ auch Dirac auf das unkomprimierte Audio anwenden, entweder live auf dem Audio-Units-Graphen oder unter Verwendung ihres Beispielcodes und anstatt den EAFReader zu verwenden, den Dirac verwendet Daten zu dem Puffer, der verwendet wird, um die Tonhöhenverschiebung durchzuführen. Sie müssen vielleicht ein wenig Magie dort tun, aber nicht so dramatisch wie das Schreiben Ihrer eigenen DSP-Implementierung der Tonhöhenverschiebung.

Fazit: Wenn Sie AVFoundation bitten können, sich nur um das Video zu kümmern, können Sie die Audiogeräte live bearbeiten und einen Rückruf einrichten, damit Sie die verarbeiteten Daten bei jeder Verarbeitung an eine Datei oder wahrscheinlich an Sie weiterleiten können Ich bin mir nicht ganz sicher, ob dieses letzte Stück möglich ist. Wenn dies nicht möglich ist, besteht die Lösung darin, Video und Audio getrennt zu synchronisieren und abzuspeichern, obwohl ich mir vorstellen kann, dass dies ein großes Problem ist, da beide gleichzeitig versuchen werden, auf die Festplatte zu schreiben. Bitte lassen Sie mich wissen, wie es geht, ich bin jetzt fasziniert.

    
Dan1one 27.08.2012 16:18
quelle
1
  • Zuerst müssen Sie demux Audio aus dem mp4-Stream entfernen. Sie benötigen dazu einen Demultiplexer (kurz Demuxer). Werfen Sie einen Blick auf MainConcept SDKs , sie unterstützen eine Reihe von Formaten.
  • Zweitens müssen Sie Ihre komprimierte Audiodatei, egal in welchem ​​Format, in roher PCM dekodieren.
  • Verwenden Sie dann eine Bibliothek, um pitch shift das rohe Audio.
  • Als nächstes müssen Sie tonhöhenversetzte Audiodaten zurück in komprimiertes Format
  • codieren
  • Und mux zurück in mp4.

Sie werden beim Decodieren etwas an Qualität verlieren. Dein Video bleibt gleich.

    
user2140005 21.03.2013 20:55
quelle

Tags und Links