2016-06-13 15 views
1

Senken, um mein Problem vorzuführen, werde ich einige Kontext geben.Wie die Qualität und Spezifikationen einer WAV-Datei auf Linux

In SDL2 Sie WAV-Dateien wie zum Beispiel aus den wiki laden können:

SDL_AudioSpec wav_spec; 
Uint32 wav_length; 
Uint8 *wav_buffer; 

/* Load the WAV */ 
if (SDL_LoadWAV("test.wav", &wav_spec, &wav_buffer, &wav_length) == NULL) { 
    fprintf(stderr, "Could not open test.wav: %s\n", SDL_GetError()); 
} else { 
    /* Do stuff with the WAV data, and then... */ 
    SDL_FreeWAV(wav_buffer); 
} 

Das Problem Ich erhalte von SDL_GetError ist Complex WAVE files not supported


Nun ist die WAV-Datei ich beabsichtige offen hat folgende Eigenschaften:

Playing test.wav. 
Detected file format: WAV/WAVE (Waveform Audio) (libavformat) 
ID_AUDIO_ID=0 
[lavf] stream 0: audio (pcm_s24le), -aid 0 
Clip info: 
encoded_by: Pro Tools 
ID_CLIP_INFO_NAME0=encoded_by 
ID_CLIP_INFO_VALUE0=Pro Tools 
originator_reference: 
ID_CLIP_INFO_NAME1=originator_reference 
ID_CLIP_INFO_VALUE1= 
date: 2016-05-1 
ID_CLIP_INFO_NAME2=date 
ID_CLIP_INFO_VALUE2=2016-05-1 
creation_time: 20:13:34 
ID_CLIP_INFO_NAME3=creation_time 
ID_CLIP_INFO_VALUE3=20:13:34 
time_reference: 
ID_CLIP_INFO_NAME4=time_reference 
ID_CLIP_INFO_VALUE4= 
ID_CLIP_INFO_N=5 
Load subtitles in dir/ 
ID_FILENAME=dir/test.wav 
ID_DEMUXER=lavfpref 
ID_AUDIO_FORMAT=1 
ID_AUDIO_BITRATE=2304000 
ID_AUDIO_RATE=48000 
ID_AUDIO_NCH=2 
ID_START_TIME=0.00 
ID_LENGTH=135.53 
ID_SEEKABLE=1 
ID_CHAPTERS=0 
Selected audio codec: Uncompressed PCM [pcm] 
AUDIO: 48000 Hz, 2 ch, s24le, 2304.0 kbit/100.00% (ratio: 288000->288000) 
ID_AUDIO_BITRATE=2304000 
ID_AUDIO_RATE=48000 
ID_AUDIO_NCH=2 
AO: [pulse] 48000Hz 2ch s16le (2 bytes per sample) 
ID_AUDIO_CODEC=pcm 

Von der wiki.libsdl.org/SDL_OpenAudioDevice Seite und anschließende wiki.libsdl.org/SDL_AudioSpec#Remarks Seite kann ich zumindest vermuten, dass eine WAV-Datei aus:

freq = 48000; 
format = AUDIO_F32; 
channels = 2; 
samples = 4096; 

Qualität funktionieren soll.

Das Hauptproblem, das ich sehen kann, ist, dass meine WAV-Datei das s16le Format hat, während es nicht auf der Seite SDL_AudioSpec aufgeführt ist.

Dies führt zu der Annahme, dass ich die Qualität von test.wav reduzieren muss, damit es in SDL nicht als "komplex" erscheint.

Wenn ich Suchmaschine Complex WAVE files not supported Suche nichts hilfreich, außer es erscheint in der SDL_Mixer-Bibliothek, die, soweit ich weiß, ich nicht verwende.

Kann das Format über ffmepg geändert werden, um in SDL2 zu arbeiten?

Bearbeiten: Dies scheint der eigentliche Code in SDL2 zu sein, wo es sich beschwert. Ich weiß nicht wirklich genug über C den ganzen Weg durch die weite SDL2 Bibliothek zu graben, aber ich dachte, es könnte helfen, wenn jemand etwas gerade von Hinting Variablennamen und solche bemerkt:

/* Read the audio data format chunk */ 
chunk.data = NULL; 
do { 
    if (chunk.data != NULL) { 
     SDL_free(chunk.data); 
     chunk.data = NULL; 
    } 
    lenread = ReadChunk(src, &chunk); 
    if (lenread < 0) { 
     was_error = 1; 
     goto done; 
    } 
    /* 2 Uint32's for chunk header+len, plus the lenread */ 
    headerDiff += lenread + 2 * sizeof(Uint32); 
} while ((chunk.magic == FACT) || (chunk.magic == LIST)); 

/* Decode the audio data format */ 
format = (WaveFMT *)chunk.data; 
if (chunk.magic != FMT) { 
    SDL_SetError("Complex WAVE files not supported"); 
    was_error = 1; 
    goto done; 
} 

Antwort

1

Nach ein paar Stunden Fun Audio Converting Ich habe es funktioniert, muss es zwicken, um zu versuchen und bessere Klangqualität zu bekommen.

die Frage auf der Hand zu beantworten, kann die Umwandlung erfolgen durch:

auf Ihrer Version von ffmpeg
ffmpeg -i old.wav -acodec pcm_s16le -ac 1 -ar 16000 new.wav 

Für Codecs:

ffmpeg -codecs 

Dieses Format arbeitet mit SDL.

Next in SDL, wenn die gewünschten SDL_AudioSpec Einstellung sicherstellen, dass die richtigen Einstellungen haben:

freq = 16000; 
format = AUDIO_S16LSB; 
channels = 2; 
samples = 4096; 

schließlich das Hauptproblem war wahrscheinlich das Erbe mit SDL_MixAudio anstelle der neueren SDL_MixAudioFormat

Mit die folgenden Einstellungen:

SDL_MixAudioFormat(stream, mixData, AUDIO_S16LSB, len, SDL_MIX_MAXVOLUME/2); wie auf dem Wiki gefunden werden.