2016-02-02 7 views
1

Сначала я хочу показать мой метод для преобразования источника сигналов .wav файлов .mp3 по Ламе библиотеки:Lame - увеличение битрейт до 320

- (void)convertFromWav:(NSString *)sourceFilePath ToMp3:(NSString *)resultName { 
    NSString *mp3FileName = [resultName stringByAppendingString:@".mp3"]; 
    NSString *mp3FilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:mp3FileName]; 

    @try { 
    int read, write; 
    FILE *pcm = fopen([sourceFilePath UTF8String], "rb"); //source 
    if (pcm == NULL) { 
     perror("fopen"); 
     return; 
    } 
    fseek(pcm, 4*1024, SEEK_CUR);         //skip file header 
    FILE *mp3 = fopen([mp3FilePath cStringUsingEncoding:1], "wb"); //output 

    const int sampleRate = 44100; 
    const int bitsPerSample = 16; 
    const int numberOfChannels = 2; 

    const int PCM_SIZE = 8192*2; 
    const int MP3_SIZE = 8192*2; 
    short int pcm_buffer[PCM_SIZE*2]; 
    unsigned char mp3_buffer[MP3_SIZE]; 

    lame_t lame = lame_init(); 
    lame_set_in_samplerate(lame, sampleRate); 
    lame_set_VBR(lame, vbr_default); 
    lame_init_params(lame); 

    lame_get_num_samples(lame); 

    long long fileSize = [[[[NSFileManager defaultManager] attributesOfItemAtPath:sourceFilePath error:nil] objectForKey:NSFileSize] longLongValue]; 
    long duration = fileSize/(sampleRate * numberOfChannels * bitsPerSample/8);//(fileSize * 8.0f)/(sampleRate * 2); 

    lame_set_num_samples(lame, (duration * sampleRate)); 
    lame_get_num_samples(lame); 

    float percent  = 0.0; 
    int totalframes = lame_get_totalframes(lame); 

    do { 
     read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm); 
     if (read == 0) 
     write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE); 
     else 
     write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE); 

     fwrite(mp3_buffer, write, 1, mp3); 

     int frameNum = lame_get_frameNum(lame); 
     if (frameNum < totalframes) 
     percent = (100. * frameNum/totalframes + 0.5); 
     else 
     percent = 100; 

     if ([_delegate respondsToSelector:@selector(convertingProgressChangedWithPercent:)]) 
     { 
     [_delegate convertingProgressChangedWithPercent:percent]; 
     } 

    } while (read != 0); 

    lame_close(lame); 
    fclose(mp3); 
    fclose(pcm); 
    } 
    @catch (NSException *exception) { 
    NSLog(@"%@",[exception description]); 
    } 
    @finally { 
    if ([_delegate respondsToSelector:@selector(convertingDidFinish:)]) 
    { 
     [_delegate convertingDidFinish:mp3FilePath]; 
    } 
    } 
} 

Это нормально, и это работает. В результате у меня есть .mp3, который имеет 152000 бит в секунду. Но я хочу сделать это 320000 бит в секунду. Как я могу его изменить? Я плохо разбираюсь в этом, поэтому я не знаю, какие ценности меняются. Благодарю.

+0

Почему бы не использовать CBR вместо VBR? Постоянная скорость передачи битов позволила бы установить номер ... –

+0

Я не знаю много об этих вещах, и я знаю, что я должен изучить его больше, но на данный момент было бы здорово, если бы я мог привести к 320 Кбит. Могу ли я изменить его на CBR? –

ответ

1

Вы хотите использовать lame_set_VBR (lame_t, vbr_off);, а затем вы можете использовать lame_set_brate, где вы можете установить требуемую величину битрейта. Использование vbr_off дает режим CBR, как подтверждено в документации (см headers.h):

************************** *******************************************
Управление VBR
* ************************************************** *********************
/* Типы VBR. default = vbr_off = CBR */
int CDECL lame_set_VBR (lame_global_flags *, vbr_mode);
vbr_mode CDECL lame_get_VBR (const lame_global_flags *);

Попробуйте это:

//# for constants of settings 
const int sampleRate = 44100; 
const int bitsPerSample = 16; 
const int numberOfChannels = 2; 

const int myBitRate = 320; 

//# for Lame settings 
lame_t lame = lame_init(); 
lame_set_in_samplerate (lame_t, sampleRate); //is 44100 
lame_set_VBR   (lame_t, vbr_off); //force CBR mode 
lame_set_brate   (lame_t, myBitRate); //is 320 
lame_init_params  (lame_t); 

Также вы можете, вероятно, установка Lame, как это:
lame_t lame = lame_init(); вместо становится так: lame_t = lame_init();

Просто сказать, что если вы определили lame_t я бы ожидать, что это это имя для остальных настроек. Вы знаете, как lame_init_params (lame_t); и т. Д.

+0

Я нашел проблему, что у меня нет метода 'lame_set_CBR' (я использую библиотеку Lame, перекомпилированную для iOS и ObjC). Поэтому я должен использовать VBR. Я попробовал 'lame_set_brate', но это не помогло. Я нашел метод 'lame_set_VBR_min_bitrate_kbps', и похоже, что это помогает. Как вы думаете, это хорошее решение? Правильно ли это? –

+1

У вас есть ссылка на библиотеку? Я проверю их документы. Установка '... min_bitrate' и' ... max_bitrate' той же суммы может работать так, как вам кажется. Но использование VBR делает наихудший тип файла MP3 (с точки зрения воспроизведения и обработки точки зрения). Наконец попробуйте 'lame_set_VBR (lame_t, vbr_off);' перед использованием 'lame_set_brate', где он ожидает либо значение ** 320 **, либо ** 320000 **. –

+1

Похоже, что с 'lame_set_VBR (lame_t, vbr_off);' и 'lame_set_brate' работает и без' lame_set_VBR_min_bitrate_kbps'. Так может быть, когда используется vbr_off, это CBR? Я использовал эту [link] (https://github.com/wuqiong/mp3lame-for-iOS) для создания библиотеки фреймов, которая мне нужна. –

Смежные вопросы