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;
}