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
Inhalt eines Wav files bearbeiten
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.
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?
- __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
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.__blackjack__ hat geschrieben: ↑Dienstag 23. Januar 2024, 07:21 ..., weil man in Dateien nichts irgendwo mitten drin einfügen kann.
Zuletzt geändert von opus59 am Dienstag 23. Januar 2024, 12:59, insgesamt 1-mal geändert.
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.opus59 hat geschrieben: ↑Dienstag 23. Januar 2024, 12:39Natü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.__blackjack__ hat geschrieben: ↑Dienstag 23. Januar 2024, 07:21 ..., weil man in Dateien nichts irgendwo mitten drin einfügen kann.
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.
"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
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.
- 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
[Quelle] -> Python-Programm -> Unix-Socket -> Anderes Programm, dass den Stream liest
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server