9 Stimmen

Wie kann man PCM-Audiorohdaten ohne eine Audiobibliothek bearbeiten?

Ich bin daran interessiert, Teile einer PCM-WAV-Datei präzise zu extrahieren, und zwar bis auf Sample-Ebene. Die meisten Audiomodule scheinen auf plattformspezifische Audiobibliotheken angewiesen zu sein. Ich möchte diese Cross-Plattform zu machen und Geschwindigkeit ist kein Problem, gibt es keine native Python-Audio-Module, die dies tun können?

Wenn nicht, muss ich die PCM-Binärdatei interpretieren. Während ich sicher bin, ich kann graben, bis die PCM-Spezifikationen ziemlich leicht, und Rohformate sind einfach genug, um zu gehen, ich habe nie tatsächlich mit binären Daten in Python vor behandelt. Gibt es irgendwelche guten Ressourcen, die erklären, wie dies zu tun? Speziell in Bezug auf Audio wäre nur Zuckerguss sein.

0 Stimmen

Dies sollte in Python sehr interessant sein. Sie sollten darüber bloggen, wenn Sie Ihr eigenes Programm erstellen müssen.

7voto

tzot Punkte 86792

Ich habe die Frage und die Antworten gelesen und habe das Gefühl, dass ich etwas völlig Offensichtliches übersehen habe, denn niemand hat die beiden folgenden Module erwähnt:

  • audioop : Manipulation von Audio-Rohdaten
  • Welle : Lesen und Schreiben von WAV-Dateien

Vielleicht komme ich aus einem Paralleluniversum und Guidos Zeitmaschine ist eigentlich eine Raum-Zeit-Maschine :)

Sollten Sie einen Beispielcode benötigen, fragen Sie uns einfach.

PS Wenn man von einer Abtastrate von 48 kHz ausgeht, ist ein Videobild bei 24/1,001==23,976023976 fps 2002 Audio-Samples lang, und bei 25fps sind es 1920 Audio-Samples.

1 Stimmen

Ich glaube, RTFMing ist eine längst verlorene Kunst.

0 Stimmen

Wow, ich bin mir nicht sicher, wie ich das übersehen konnte, aber ich schätze, es wurde einfach unter all den Audiobibliotheks-Wrappern da draußen begraben. Hoffentlich ist dies plattformübergreifend und genau genug, aber es sieht aus wie es ist.

5voto

JaCraig Punkte 1053

Ich habe nur einen PCM-Reader in C++ und Java geschrieben, aber das Format selbst ist recht einfach. Eine anständige Beschreibung findet sich hier: http://ccrma.stanford.edu/courses/422/projects/WaveFormat/

Danach sollten Sie sie einfach einlesen können (Lesen von Binärdateien), http://www.johnny-lin.com/cdat_tips/tips_fileio/bin_array.html ) und verarbeiten Sie einfach das resultierende Array. Es kann sein, dass Sie einige Bitverschiebungen vornehmen müssen, um die Ausrichtungen zu korrigieren ( https://docs.python.org/reference/expressions.html#shifting-operations ), aber je nachdem, wie Sie es einlesen, brauchen Sie das vielleicht nicht.

Trotzdem würde ich mich für Davids Ansatz entscheiden.

1voto

David Z Punkte 121773

Ist es wirklich wichtig, dass Ihre Lösung aus reinem Python besteht, oder würden Sie etwas akzeptieren, das mit nativen Audiobibliotheken auf verschiedenen Plattformen arbeiten kann (also effektiv plattformübergreifend ist)? Es gibt mehrere Beispiele für Letzteres unter http://wiki.python.org/moin/PythonInMusic

1voto

basszero Punkte 29038

Scheint eine Kombination aus open(..., "rb") zu sein, Strukturmodul und einige Details über die wav/riff-Dateiformat (wahrscheinlich gibt es bessere Referenzen) wird die Aufgabe erfüllen.

Ich bin nur neugierig, was Sie mit den Rohdaten der Stichprobe zu tun gedenken.

0 Stimmen

Ich muss eine lange wav-Datei in Teile zerlegen, die einer Reihe von In- und Out-Punkten entsprechen. Das muss so genau sein, dass es bei jeder Bildrate genau auf das Video abgestimmt werden kann. Die meisten Bibliotheken sind nur auf eine Zehntelsekunde genau, während selbst unsere niedrigsten Frameraten bei 12 fps beginnen. Ich hätte viel lieber eine Genauigkeit von 44.000stel Sekunden.

0voto

Ian Conway Punkte 367

Ich habe nachgeforscht und das hier gefunden: http://www.swharden.com/blog/2009-06-19-reading-pcm-audio-with-python/ Es erfordert Numpy (und matplotlib, wenn Sie es grafisch darstellen wollen)

import numpy
data = numpy.memmap("test.pcm", dtype='h', mode='r')
print "VALUES:",data

Weitere Informationen finden Sie auf der Website des Autors.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X