2016-06-13 3 views
1

문제를 미리 설명하기 위해 몇 가지 설명을 드리겠습니다. 이 같은 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; 
} 

답변

1

을 재미있는 오디오 변환 나는 그것이 작동하도록 노력해야하고 더 나은 음질을 얻으려면 조정해야 할 것입니다.

을 수행 할 수있는 변환, 손에 질문에 대답하려면 :

ffmpeg -i old.wav -acodec pcm_s16le -ac 1 -ar 16000 new.wav 

이는 FFmpeg의 버전에 코덱을 찾으려면 :

ffmpeg -codecs 

이 형식은 SDL와 함께 작동합니다. 마지막으로 주요 문제가 가장 가능성이 새로운 SDL_MixAudioFormat

로 대신 기존 SDL_MixAudio을 사용했다

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

다음 원하는 SDL_AudioSpec를 설정할 때 SDL 내

다음 올바른 설정을 가지고 있는지 확인 다음 설정 : 위키에서 찾을 수있는

SDL_MixAudioFormat(stream, mixData, AUDIO_S16LSB, len, SDL_MIX_MAXVOLUME/2);