2017-02-05 4 views
0

내 질문에 더 컨텍스트를 보려면 여기를 참조하십시오 : 나는의 오디오 포맷 PCM이있는 24 비트 WAV 파일이 https://gamedev.stackexchange.com/questions/136817/how-to-get-sdl2-to-play-32bit-wav-files32 비트 위해 24 비트 WAV 파일을 변환하는 방법 동안 유지 오디오 포맷 PCM = 1 (선형 양자화)

1, 여기를 참조하십시오 :to AudioFormat ffmpeg -i input.wav -ar 48000 -ac 2 -acodec pcm_s16le output.wav을 사용하여 16 비트로 내 WAV 파일 (24 비트)을 변환 할 때 오디오 형식 PCM = 0x001을 유지합니다.

ffmpeg -i input.wav -ar 48000 -ac 2 -acodec pcm_s32le output.wav을 사용하는 경우 오디오 형식 PCM = 0xfffe.

SDL2은 (부모의 문제에서 볼 수 있듯이) 파일 만 리니어 PCM 오디오 포맷 (1)과 함께 재생할 수 있습니다, 어떻게 SDL2로 (32 비트 위쪽 내 24 비트 WAV 파일을 변환 sox 또는 ffmpeg를 사용하여 어떻게 확실하지 오전에만 32 비트 및 16 비트 재생).

내가 묻는 것은 가능한가? WAV 파일에 대한 더 많은 정보와 ffmpeg가 헤더 번호를 변경하는 이유는 크게 감사하겠습니다.

답변

1

는 FFmpeg 코덱 태그

... 
waveformatextensible = (par->channels > 2 && par->channel_layout) || 
         par->channels == 1 && par->channel_layout && par->channel_layout != AV_CH_LAYOUT_MONO || 
         par->channels == 2 && par->channel_layout && par->channel_layout != AV_CH_LAYOUT_STEREO || 
         par->sample_rate > 48000 || 
         par->codec_id == AV_CODEC_ID_EAC3 || 
         av_get_bits_per_sample(par->codec_id) > 16; 

if (waveformatextensible) 
    avio_wl16(pb, 0xfffe); 
... 

원유 시도가 단지 01 00와 0x20에있는 2 바이트를 교체하려고하는 것입니다을 설정하려면 다음 코드를 사용합니다. 작동하지 않는데이 동작이 사양을 벗어난 경우 bug report을 제출하십시오.

+0

파일의 16 진수를 수동으로 편집하여 정상적인 방법으로 재생할 수 있는지 알아 봅니다. ffmpeg에 관한 몇 가지 버그 리포트가 확장 가능한 포맷과 관련된 몇 가지 유사한 문제와 관련되어 있음을 알 수 있습니다. 그 라인은 특히 (> 2 channels = false, sample_rate> 48k = false, av_get_bits_per_sample> 16 = true (아마도 함수/매크로를 살펴 봐야 할 것입니다.)), 그걸 가지고 놀고 뒤로. 이 문제를 조사해 주셔서 감사합니다. – jake

+0

Vim을 사용하여 WAV 헤더의 바이트 20과 21을 'fe ff' (0xfffe)에서'01 00' (0x0001)으로 편집하면 SDL2 (상위 게시물)에서 부호있는 32 비트 리틀 엔디안 오디오를 완벽하게 재생할 수 있습니다. 이 문제를 버그로보고하는 방법에 대해서는 확실치 않지만 어쨌든 들어 본 적이 없지만 "확장 가능 파형 형식"에 대한 이유가있을 수 있습니다. – jake

+0

나는 여기서 SDL2가 잘못이라고 생각한다. 원래 WAVE 사양은 8 비트 및 16 비트 샘플 만 허용했습니다. 최신 사양을 사용하면 샘플 깊이와 속도를 높일 수 있습니다. 버그 보고서는 SDL 프로젝트에 제출해야합니다. – Mulvya

관련 문제