Knackton beim Abspielen von Sounds

    Knackton beim Abspielen von Sounds

    Hallo zusammen,

    zunächst kurze Einführung: Ich arbeite an einem Avdventuregame, bei dem sehr viele Sprachtexte als Audiodateien abgespielt werden sollen. Die Dateien sind allesamt in einem gesonderten Ordner untergebracht und werden bei Bedarf eingeladen und abgespielt. Danach werden sie aus dem Speicher wieder gelöscht. Nun ist folgendes Problem aufgetreten:
    Am Ende der Sprachdatei ertönt ein Knacken. Ich habe leider keine Ahnung woran das liegen kann. Hier der Algorythmus, mit dem die Sprachdatei eingeladen wird:


    Quellcode

    1. {
    2. // This function loads a sound file (speaking files) and returns a buffer
    3. // argument0 = filename
    4. if(!file_exists(argument0))
    5. {
    6. return -1;
    7. }
    8. global.buffer_for_sound_files = buffer_load(argument0);
    9. var format = buffer_peek(global.buffer_for_sound_files, 20, buffer_u16);
    10. if (format == 1)
    11. format = buffer_s16;
    12. else
    13. format = buffer_u8;
    14. var channels = buffer_peek(global.buffer_for_sound_files, 22, buffer_u16)-1;
    15. var sample_rate = buffer_peek(global.buffer_for_sound_files, 24, buffer_u32);
    16. var sample_length = (buffer_get_size(global.buffer_for_sound_files)-46);
    17. var snd_id = audio_create_buffer_sound(global.buffer_for_sound_files, format, sample_rate, 44, sample_length, channels);
    18. if (snd_id < 0)
    19. show_debug_message("Sound not found! Error:" + string(snd_id));
    20. return snd_id;
    21. }


    Woher kommt das Knacken am Ende? Wie kann man es vermeiden?
    Hi Allakon,

    geiles Script.

    Ich nutze jetzt zwar nicht GM6 und habe das Script mir mal für Studio angepasst.

    GML-Quellcode

    1. {
    2. // This function loads a sound file (speaking files) and returns a buffer
    3. // argument0 = filename
    4. if(!file_exists(argument0))
    5. {
    6. return -1;
    7. }
    8. global.buffer_for_sound_files = buffer_load(argument0);
    9. rate = 44100;
    10. sample_length = (buffer_get_size(global.buffer_for_sound_files));
    11. snd_id = audio_create_buffer_sound(global.buffer_for_sound_files, buffer_s16, rate, 0, sample_length, audio_stereo);
    12. return snd_id;
    13. }


    Das funktioniert mit PCM-Wav Dateien wunderbar.

    Bei deinem Script ist mir dein Bufferoffset unklar.

    GML-Quellcode

    1. var snd_id = audio_create_buffer_sound(global.buffer_for_sound_files, format, sample_rate, 44, sample_length, channels);
    2. //Wozu die 44


    Dein eigentlicher Fehler liegt aber wohl hier:

    GML-Quellcode

    1. var sample_length = (buffer_get_size(global.buffer_for_sound_files)-46);
    2. //Was soll die -46 ?


    Wenn ich bei GM-Studio eine falsche Buffergröße angebe wirft mir GM-S einen Open-Al Error und es wird gar kein Sound abgespielt.
    Warum ziehst du von der Buffergröße 46 ab?
    Das wird bei dir vielleicht toleriert, wirft aber garantiert einen Fehler.
    Hi, ich hatte früher Allakon dieses Skript gemacht (auch wenn dieses leicht abgeändert ist)
    Das selbst ist für Studio konzipiert und der offset usw. habe ich aus der wiki zum WAV Format.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
    Benutze doch Anstelle die relativ neue Funktion audio_create_stream(filename). Dann kannst/musst du auch anstatt WAVE Dateien, Ogg Vorbis Dateien verwenden, welche den Speicherplatz auf ein Bruchteil reduzieren. Zudem wird die Datei über einem Stream von der Festplatte gespielt, wodurch auch die Sounddatei schneller abgespielt wird und weniger Arbeitsspeicher verbraucht. Deine Spieler werden es dir danken, wenn sie kein Gigabyte großes Spiel runterladen müssen.

    Denke auch daran die Audio Dateien erst ein paar Steps später zu löschen. Es könnte sein, dass die Datei noch in einen Step hineingespielt wird und dann schon vorher gelöscht wird.

    Als letzte Option: Vieleicht ist das Knacken auch in der Aufnahme selber und es wurde einfach nur ungünstig geschnitten. Kann ganz einfach mit einem Fade-Out gelöst werden.

    Danke für die guten Antworten.

    Arbeite seit längerer zeit mit Studio. Habe das Spiel damals mit GM6 angefangen und es dann auf Studio übertragen. Das mit der neuen Funktion klingt vielversprechend, vor allem wegen dem Speicherplatz. Werde alles einmal ausprobieren.

    P.S. Es könnte tatsächlich sein, dass die Datei zu schnell gelöscht wurden ist.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Allakon“ ()