2016-06-13 12 views
1

私の問題を序文するために、いくつかの文脈を示します。あなたは、このようなwikiからとwavファイルを読み込むことができSDL2でLinux上で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


ですオープンは、以下の特性を有する:

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では「複雑」とは見えません。

私が検索エンジンComplex WAVE files not supportedを利用しているときは、SDL_Mixerライブラリには表示されませんが、私が使用していないことは分かりません。

ffmepgでフォーマットを変更してSDL2で動作させることはできますか?

編集:これは、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ののバージョンのコーデックを見つけるには

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

::変換し、手での質問に答えるために

をすることによって行うことができ

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); wikiにあります。

関連する問題