2016-06-13 59 views
1

因此,爲了說明我的問題,我將給出一些上下文。如何降低linux上的wav文件的質量和規格

在SDL2可以加載WAV文件,例如從wiki

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得到的問題是Complex WAVE files not supported


現在我打算WAV文件打開具有以下屬性:

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 

從wiki.libsdl.org/SDL_OpenAudioDevice頁面和隨後的頁面wiki.libsdl.org/SDL_AudioSpec#Remarks我至少可以推測的wav文件:

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

質量應該工作。

我能看到的主要問題是我的wav文件有s16le格式,而它沒有在SDL_AudioSpec頁面上列出。

這使我相信我需要降低test.wav的質量,因此它在SDL中顯示爲「複雜」。

當我搜索引擎Complex WAVE files not supported什麼有用的出現,除了它出現在SDL_Mixer庫中,據我所知我不使用。

可以通過ffmepg更改格式以便在SDL2中工作?

編輯:這似乎是SDL2中它投訴的實際代碼。我真的不知道有足夠的瞭解C到挖通了廣大SDL2庫中的所有方法,但我想如果有人注意到的東西剛提示的變量名和等可能會有所幫助:

/* 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接下來設置所需SDL_AudioSpec時確保有正確的設置:

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

最後的主要問題是最有可能使用,而不是新的SDL_MixAudioFormat

與傳統SDL_MixAudio以下設置:

SDL_MixAudioFormat(stream, mixData, AUDIO_S16LSB, len, SDL_MIX_MAXVOLUME/2);可以在wiki上找到。