2009-05-08 9 views
8

Ich interessiere mich für das genaue Extrahieren von Teilen einer PCM-WAV-Datei bis auf die Probenebene. Die meisten Audiomodule scheinen auf plattformspezifische Audiobibliotheken angewiesen zu sein. Ich möchte diese plattformübergreifende und Geschwindigkeit machen ist kein Problem, gibt es native Python-Audio-Module, die das können?Wie bearbeitet man rohe PCM-Audiodaten ohne eine Audiobibliothek?

Wenn nicht, muss ich die PCM-Binärdatei interpretieren. Während ich sicher bin, dass ich die PCM-Spezifikationen ziemlich leicht ausgraben kann und rohe Formate einfach zu laufen sind, habe ich in Python noch nie mit binären Daten gearbeitet. Gibt es irgendwelche guten Quellen, die erklären, wie man das macht? Speziell in Bezug auf Audio wäre nur Sahnehäubchen.

+0

Dies sollte in Python sehr intesting sein. Sie sollten darüber bloggen, wenn Sie Ihre eigenen rollen müssen. –

Antwort

6

las ich die Frage und die Antworten, und ich fühle, dass ich etwas ganz offensichtlich fehlen darf, weil niemand die beiden folgenden Module genannt:

  • audioop: manipulieren rohe Audiodaten
  • wave: lesen und Schreib WAV-Dateien

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

Wenn Sie Beispielcode benötigen, zögern Sie nicht zu fragen.

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

+0

ISTM, dass RTFMing eine lange verlorene Kunst ist. – tzot

+0

Wow, ich bin mir nicht sicher, wie ich das verpasst habe, aber ich denke, es wurde einfach unter all den Audiobibliotheks-Wrappern vergraben. Hoffentlich ist das plattformübergreifend und genau genug, aber es sieht so aus. – Soviut

1

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

1

Scheint wie eine Kombination aus Open (..., „rb“), struct module und einige Details über die wav/riff file format (wahrscheinlich bessere Referenz gibt) wird die Arbeit machen.

Nur neugierig, was haben Sie vor, mit den rohen Beispieldaten zu tun?

+0

Ich muss einen langen wav in Stücke schneiden, die einer Reihe von In- und Out-Punkten entsprechen. Es muss genau sein, damit es bei jeder Bildrate genau auf Video abgestimmt werden kann.Die meisten Libraries sind nur auf 1/10 Sekunde genau, während unsere niedrigsten Frameraten bereits bei 12 fps beginnen. Ich hätte lieber eine Genauigkeit von 44.000 Sekunden. – Soviut

5

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

Vergangenheit, dass Sie in der Lage sein sollten, nur lesen (binäre Datei lesen, http://www.johnny-lin.com/cdat_tips/tips_fileio/bin_array.html) und einfach mit dem resultierenden Array beschäftigen. Möglicherweise müssen Sie ein Bit-Shifting verwenden, um die Ausrichtungen korrekt zu machen (https://docs.python.org/reference/expressions.html#shifting-operations), aber abhängig davon, wie Sie es eingelesen haben, müssen Sie dies möglicherweise nicht tun.

All dies gesagt, würde ich immer noch in Richtung Davids Ansatz neigen.