2016-09-27 3 views
2

libSoX API를 사용하여 메모리 버퍼에서 오디오를 프로그래밍 방식으로 변환하려고합니다. 예를 들어, 샘플링 속도를 바꾸는 데는 문제가 없지만 PCM과 FLAC 사이의 변환에는 문제가 있습니다.libsox를 사용하여 오디오를 FLAC으로 변환하십시오.

QByteArray inData = [...]; 
sox_effect_t *e; 
char *args[10]; 

sox_globals.output_message_handler = output_message; 
sox_globals.verbosity = 4; 

assert(sox_init() == SOX_SUCCESS); 

sox_signalinfo_t in_signal_info; 
in_signal_info.channels = numChannels; 
in_signal_info.length = numSamples * numChannels; 
in_signal_info.precision = precision; 
in_signal_info.rate = sampleRate; 
in_signal_info.mult = NULL; 

sox_encodinginfo_t in_encoding_info; 
in_encoding_info.bits_per_sample = bitsPerSample; 
in_encoding_info.encoding = SOX_ENCODING_SIGN2; 

in_encoding_info.reverse_bytes = sox_option_no; 
in_encoding_info.reverse_bits = sox_option_no; 
in_encoding_info.opposite_endian = sox_false; 
in_encoding_info.reverse_nibbles = sox_option_no; 

sox_format_t *in = 
    sox_open_mem_read(inData, inData.size(), 
         &in_signal_info, &in_encoding_info, "raw"); 

sox_format_t *out_format = (sox_format_t *)malloc(sizeof(sox_format_t)); 
memcpy(out_format, in, sizeof(sox_format_t)); 
out_format->encoding.encoding = SOX_ENCODING_FLAC; 

char *outbuffer; 
size_t outbuffer_size; 
sox_format_t *out = sox_open_memstream_write(&outbuffer, &outbuffer_size, 
              &out_format->signal, 
              &out_format->encoding, "flac", NULL); 

sox_effects_chain_t *chain = 
sox_create_effects_chain(&in->encoding, &out->encoding); 

e = sox_create_effect(sox_find_effect("input")); 
args[0] = (char *)in; 
assert(sox_effect_options(e, 1, args) == SOX_SUCCESS); 
assert(sox_add_effect(chain, e, &in->signal, &in->signal) == SOX_SUCCESS); 
free(e); 

e = sox_create_effect(sox_find_effect("output")); 
args[0] = (char *)out; 
assert(sox_effect_options(e, 1, args) == SOX_SUCCESS); 
assert(sox_add_effect(chain, e, &in->signal, &out->signal) == SOX_SUCCESS); 
free(e); 

sox_flow_effects(chain, NULL, NULL); 
sox_delete_effects_chain(chain); 
sox_close(out); 
free(out_format); 
free(outbuffer); 
sox_close(in); 

출력 내가 얻을 :

DBUG formats: opening format plugin `lsx_flac_format_fn': library 0x1075ee0, entry point 0x7f3258eee5c0 
FAIL formats: can't open output file `': FLAC compression level must be a whole number from 0 to 8 
demo_sox: main.cpp:120: int main(int, char **): Assertion `sox_effect_options(e, 1, args) == SOX_SUCCESS' failed. 

그것은에 실패 있습니다

e = sox_create_effect(sox_find_effect("output")); 
args[0] = (char *)out; 
assert(sox_effect_options(e, 1, args) == SOX_SUCCESS); 

거의 LibSoX 사용에 대한 어떠한 문서, 내가 올바른 그 일을하지 오전

?

out_format->encoding.encoding = SOX_ENCODING_FLAC; 
out_format->encoding.compression = 8; 
:

답변

2

대답은 출력 포맷 FLAC 압축 수준을 지정하는 것
관련 문제