문제를 미리 설명하기 위해 몇 가지 설명을 드리겠습니다. 이 같은 wiki 일부터 wav 파일을로드 할 수 있습니다 SDL2에서리눅스에서 wav 파일의 품질과 사양을 낮추는 방법
:
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);
}
내가 SDL_GetError에서 받고 있어요 문제는 지금 내가하려는있어 wav 파일 Complex WAVE files not supported
입니다 open은 다음 속성을가집니다.
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
freq = 48000;
format = AUDIO_F32;
channels = 2;
samples = 4096;
품질 작동합니다 다음 wiki.libsdl.org/SDL_OpenAudioDevice 페이지 및 후속 wiki.libsdl.org/SDL_AudioSpec#Remarks 페이지에서 나는 최소한의 wav 파일이 있음을 추측 할 수 있습니다.
내가 볼 수있는 주된 문제점은 내 wav 파일이 s16le
형식 인 반면 SDL_AudioSpec 페이지에는 표시되지 않는 것입니다.
이렇게하면 test.wav의 품질을 떨어 뜨려 SDL에서 "복잡"하지 않게 될 것입니다.
내가 엔진을 검색 할 때도움이되지 않는다면 SDL_Mixer 라이브러리에 표시되는 것을 제외하고는 사용하지 않는 것이 좋습니다.
SDL2에서 작동하도록 ffmepg를 통해 형식을 변경할 수 있습니까?
편집 : 이것은 불평하는 SDL2의 실제 코드 인 것으로 보입니다. 정말 광대 한 SDL2 라이브러리를 통해 모든 방법을 파고 C에 대해 충분히 잘 모르겠지만, 나는 누군가가 단지 변수 이름과 같은 암시에서 뭔가를 통지 경우 도움이 될 생각 : 몇 시간 후
/* 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;
}