Inhalt eines Wav files bearbeiten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
opus59
User
Beiträge: 6
Registriert: Montag 22. Januar 2024, 18:46

Moin,

Ich suche nach der Möglichkeit den Inhalt eines .wav files zu bearbeiten.
Genauerer gesagt möchte ich an einer bestimmten Stelle einen kurzen Ton (Sinuswelle) hinzufügen.
Mittels .writeframes() geht das m.E. nur ans Ende des files
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du liest die als Ganzes ein & modifizierst die gewünschte stelle, und schreibst alles weg.
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Muss es dafür unbedingt Python sein? Ich würde sowas wahrscheinlich mit ffmpeg auf der Kommandozeile machen. Die entsprechenden Parameter für die Arbeitsschritte (Sinus-Ton mit bestimmter Länge erzeugen + diesen an bestimmter Stelle einfügen) kann man per Google herausfinden. Falls du bis heute Abend nichts hast, setze ich mich da evtl. mal dran.
opus59
User
Beiträge: 6
Registriert: Montag 22. Januar 2024, 18:46

snafu hat geschrieben: Dienstag 23. Januar 2024, 05:44 Muss es dafür unbedingt Python sein?
Leider ja, die Daten für die Änderung (welcher Zeitpumkt, Amplitude und Freuenz) ergeben sich durch die aktuellen Daten der laufenden Anwendung. Das ganze File zu schreiben 6 Sekunden) würde m.E. zu lange dauern.
Bin ich mit .writeframes auf dem Holzweg?
Benutzeravatar
__blackjack__
User
Beiträge: 13121
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@opus59: Es wird nicht anders gehen, weil man in Dateien nichts irgendwo mitten drin einfügen kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
opus59
User
Beiträge: 6
Registriert: Montag 22. Januar 2024, 18:46

__blackjack__ hat geschrieben: Dienstag 23. Januar 2024, 07:21 ..., weil man in Dateien nichts irgendwo mitten drin einfügen kann.
Natürlich muss man die Datei öffnen (und dabei einlesen). Wenn ich die eingelesenen Daten an der richtigen Stelle ändere und dann alles wieder speichere sollte es doch gehen.
Zuletzt geändert von opus59 am Dienstag 23. Januar 2024, 12:59, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4197
Registriert: Freitag 17. April 2009, 10:28

@opus59: Na, was denn nun? "Das ganze File zu speichern" dauert dir zu lange aber "alles wieder speichern" geht?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

opus59 hat geschrieben: Dienstag 23. Januar 2024, 12:39
__blackjack__ hat geschrieben: Dienstag 23. Januar 2024, 07:21 ..., weil man in Dateien nichts irgendwo mitten drin einfügen kann.
Natürlich muss man die Datei öffnen (und dabei einlesen). Wenn ich die eingelesen Daten an der richtigen Stelle ändere und dann alles wieder speichere sollte es doch gehen.
Alles wieder speichern ist was ich schon vorgeschlagen habe. ALLES wieder speichern. Es gibt - zumindest für echtes einfügen, also verschieben der Daten danach - keine substantiell andere Lösung. Man kann etwas optimieren mit erst-ab-da schreiben, muss dann aber zb auch den WAV Header anpassen, und der ist ja am Anfang. Muss man aber selbst bauen & hilft nur wirklich, wenn Daten weit hinten eingefügt werden.

Mit bordmitteln des WAV-file-Moduls ist es also immer die gesamte Datei.

Und dann gäbe es noch Memory mapped IO wenn es statt einfügen ersetzen ist. Da kann man tatsächlich etwas sparen.

Aber auch das nur handgemacht.
opus59
User
Beiträge: 6
Registriert: Montag 22. Januar 2024, 18:46

__deets__ hat geschrieben: Dienstag 23. Januar 2024, 12:49 Mit bordmitteln des WAV-file-Moduls ist es also immer die gesamte Datei.
Verstanden, dann war ich auf dem falschen Weg.
Danke für die Antworten!
opus59
User
Beiträge: 6
Registriert: Montag 22. Januar 2024, 18:46

"händisch" erledigt!

Code: Alles auswählen

from scipy.io import wavfile
from scipy.io.wavfile import write
import numpy as np

    wav_fname = 'PingEcho.wav' #name of the original file
    echoLength = 0.2 #fixed length of the echo-sound [sec]
    fd =800 #frequency
    samplerate, data = wavfile.read(wav_fname)
    if samplerate!=44100:
        return
    td=distance*3600/speedOfSound  #calculates the timedelay of the echo-sound [sec]
    t = np.linspace(td, td+ echoLength, num=int(samplerate * echoLength)) #creates an array in the desired length, initially with the timesteps of the echo-sound
    newSamples =t.size
    amplitude = np.iinfo(np.int16).max
    echodata = amplitude * np.sin(2. * np.pi * fd * t) #creation of the frequency samples
    echoIndices=np.linspace(int(td*samplerate),int((td+echoLength)*samplerate-1),num=newSamples,dtype='int32')#array with the indices to be updated of the prerecorded wav 
    np.put(data, echoIndices, echoData) #udpdating the original data with echoData
    write("PingEchoNew.wav", samplerate, data.astype(np.int16))# saving the newly created wav file
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Oeh. Das schreibt doch einfach nur das gesamte Wave-File raus, da ist doch kein Unterschied zur Ausgangsfrage.
opus59
User
Beiträge: 6
Registriert: Montag 22. Januar 2024, 18:46

Äh, nein.

Neu geschrieben (oder genauer gesagt neu berechnet) werden nur die Daten für 0,2 Sekunden. Diese werden an die festgelegte (Zeit-) Stelle geschrieben.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nö. Du liest die gesamte Datei in data ein. Modifizierst sie an an einer Stelle. Und schreibst das gesamte WAV file neu, sogar in eine neue Datei. Und das zu vermeiden war / so zumindest hat dich jeder hier verstanden - das Ziel.
Benutzeravatar
sparrow
User
Beiträge: 4197
Registriert: Freitag 17. April 2009, 10:28

Was übrigens genau das is, was __deets__ in der ersten Antwort geschrieben hat.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Anspruchsvoller wird es, wenn man es als Stream anbieten will, ohne etwas zu schreiben.

[Quelle] -> Python-Programm -> Unix-Socket -> Anderes Programm, dass den Stream liest
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten