2013-04-18 3 views
2

나는 내가ios에서 wav 파일로 FLAC 파일을 변환하는 방법은 무엇입니까?

이 제발 도와주세요 다음과 같다 WAV 변환에 FLAC의 알고리즘을 구현하는 노력이 files.For 오디오의 플락 형식을 지원 오디오 플레이어를 만들려고합니다.

이 오류를 나에게

ERROR 제공합니다 모든 시간 : 초기화 디코더 : FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE

static FLAC__bool write_little_endian_uint16(FILE *f, FLAC__uint16 x) 
{ 
return 
fputc(x, f) != EOF && 
fputc(x >> 8, f) != EOF 
; 
} 

static FLAC__bool write_little_endian_int16(FILE *f, FLAC__int16 x) 
{ 
return write_little_endian_uint16(f, (FLAC__uint16)x); 
} 

static FLAC__bool write_little_endian_uint32(FILE *f, FLAC__uint32 x) 
{ 
return 
fputc(x, f) != EOF && 
fputc(x >> 8, f) != EOF && 
fputc(x >> 16, f) != EOF && 
fputc(x >> 24, f) != EOF 
; 
} 

int main(int argc, char *argv[]) 
{ 
const char *input = "demo_audio_shaer.flac"; 
printf("aa[0]====%s",argv[0]); 

FLAC__bool ok = true; 
FLAC__StreamDecoder *decoder = 0; 
FLAC__StreamDecoderInitStatus init_status; 
FILE *fout; 

if((fout = fopen(argv[2], "wb")) == NULL) { 
    fprintf(stderr, "ERROR: opening %s for output\n", argv[2]); 
    return 1; 
} 

if((decoder = FLAC__stream_decoder_new()) == NULL) { 
    fprintf(stderr, "ERROR: allocating decoder\n"); 
    fclose(fout); 
    return 1; 
} 

(void)FLAC__stream_decoder_set_md5_checking(decoder, true); 
init_status = FLAC__stream_decoder_init_file(decoder, input, write_callback, metadata_callback, error_callback, /*client_data=*/fout); 
if(init_status != FLAC__STREAM_DECODER_INIT_STATUS_OK) { 
    fprintf(stderr, "ERROR: initializing decoder: %s\n", FLAC__StreamDecoderInitStatusString[init_status]); 
    ok = false; 
} 

if(ok) { 
    ok = FLAC__stream_decoder_process_until_end_of_stream(decoder); 
    fprintf(stderr, "decoding: %s\n", ok? "succeeded" : "FAILED"); 

    fprintf(stderr, " state: %s\n", FLAC__StreamDecoderStateString[FLAC__stream_decoder_get_state(decoder)]); 
} 

FLAC__stream_decoder_delete(decoder); 
fclose(fout); 

return 0; 
} 

FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder, const     FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) 
{ 
FILE *f = (FILE*)client_data; 
const FLAC__uint32 total_size = (FLAC__uint32)(total_samples * channels * (bps/8)); 
size_t i; 

(void)decoder; 

if(total_samples == 0) { 
    fprintf(stderr, "ERROR: this example only works for FLAC files that have a total_samples count in STREAMINFO\n"); 
    return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; 
} 
if(channels != 2 || bps != 16) { 
    fprintf(stderr, "ERROR: this example only supports 16bit stereo streams\n"); 
    return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; 
} 

/* write WAVE header before we write the first frame */ 
if(frame->header.number.sample_number == 0) { 
    if(
     fwrite("RIFF", 1, 4, f) < 4 || 
     !write_little_endian_uint32(f, total_size + 36) || 
     fwrite("WAVEfmt ", 1, 8, f) < 8 || 
     !write_little_endian_uint32(f, 16) || 
     !write_little_endian_uint16(f, 1) || 
     !write_little_endian_uint16(f, (FLAC__uint16)channels) || 
     !write_little_endian_uint32(f, sample_rate) || 
     !write_little_endian_uint32(f, sample_rate * channels * (bps/8)) || 
     !write_little_endian_uint16(f, (FLAC__uint16)(channels * (bps/8))) || /* block align */ 
     !write_little_endian_uint16(f, (FLAC__uint16)bps) || 
     fwrite("data", 1, 4, f) < 4 || 
     !write_little_endian_uint32(f, total_size) 
     ) 
    { 
     fprintf(stderr, "ERROR: write error\n"); 
     return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; 
    } 
} 

/* write decoded PCM samples */ 
for(i = 0; i < frame->header.blocksize; i++) { 
    if(
     !write_little_endian_int16(f, (FLAC__int16)buffer[0][i]) || /* left channel */ 
     !write_little_endian_int16(f, (FLAC__int16)buffer[1][i])  /* right channel */ 
     ) { 
     fprintf(stderr, "ERROR: write error\n"); 
     return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; 
    } 
} 

return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; 
} 

void metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) 
{ 
(void)decoder, (void)client_data; 

/* print some stats */ 
if(metadata->type == FLAC__METADATA_TYPE_STREAMINFO) { 
    /* save for later */ 
    total_samples = metadata->data.stream_info.total_samples; 
    sample_rate = metadata->data.stream_info.sample_rate; 
    channels = metadata->data.stream_info.channels; 
    bps = metadata->data.stream_info.bits_per_sample; 

    fprintf(stderr, "sample rate : %u Hz\n", sample_rate); 
    fprintf(stderr, "channels  : %u\n", channels); 
    fprintf(stderr, "bits per sample: %u\n", bps); 
#ifdef _MSC_VER 
    fprintf(stderr, "total samples : %I64u\n", total_samples); 
#else 
    fprintf(stderr, "total samples : %llu\n", total_samples); 
#endif 
} 
} 

void error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) 
{ 
(void)decoder, (void)client_data; 

fprintf(stderr, "Got error callback: %s\n", FLAC__StreamDecoderErrorStatusString[status]); 
} 

답변

1

그것의 불가능 직접 AVFoundation 프레임 워크를 사용하여 FLAC 파일을 재생합니다. 지원은 다음과 같습니다 : 다음 위의 주어진

*AAC 
*HE-AAC 
*AMR (Adaptive Multi-Rate, a format for speech) 
*ALAC (Apple Lossless) 
*iLBC (internet Low Bitrate Codec, another format for speech) 
*IMA4 (IMA/ADPCM) 
*linear PCM (uncompressed) 
*µ-law and a-law 
*MP3 (MPEG-1 audio layer 3 

그러나 feasible formatconverting 후에는 AVFoundation 프레임 워크를 사용하여 played 할 수 있습니다.

편집 : Libraryconverting to wav입니다. 좋은 예를 here

편집 : 내 솔루션을 제안 할 수 FLAC에게

+0

오디오 플레이어에서 FLAC 파일을 재생하고 싶습니다. 가능하지 않은 경우 어떤 프레임 워크를 사용해야합니까? –

+0

AVACudioPlayer에서 FLAC을 지원하지 않습니다. –

+0

인코딩/디코딩없이 flac 파일을 재생할 수있는 방법이 있습니까? –

3

을 재생 FFMPEG 라이브러리를 사용합니다. https://github.com/Krivoblotsky/KSAudioPlayer

* .flac 및 기타 많은 파일 형식을 지원합니다.

+0

유용한 내 요구 사항에 따라 만약 내가 답변에 동의 wav 파일 – Mak13

+0

물론 가능합니다. Bass License를 충족 시키면 사용할 수 있습니다. http://www.un4seen.com/bass.html#license – Krivoblotsky

관련 문제