1. 程式人生 > >iOS 音訊轉碼 使用lame轉為MP3格式

iOS 音訊轉碼 使用lame轉為MP3格式

由於AVAudioRecorder不能錄製編碼為MP3,所以就需要我們將錄音後的音訊檔案格式進行轉換(注意:AV Foundation和Core Audio提供對MP3資料解碼的支援,但是不提供對其進行編碼。所以我們要藉助第三方庫進行MP3編碼)。如何轉換?lame無疑是一個很好的選擇,lame是一個開源音訊壓縮軟體,目前是公認有損質量MP3中壓縮效果最好的編碼器。接下來直奔主題,介紹一下如何使用lame將音訊轉為MP3格式。

一、使用lame的準備工作

首先去官網下載lame庫(下載地址),下載後需要將lame庫進行編譯(編譯指令碼下載地址)。編譯步驟如下:
1、
在桌面上新建一個資料夾,然後將下載後的lame庫檔案解壓命名為lame和編譯指令碼檔案一同放到當前檔案中,像這樣:

1240
1370044-3a69132b1eaa6abd.png


2、
  開啟終端,cd到lame-3.99.5目錄中,執行指令碼,開始編譯。編譯時間稍微有點長,編譯成功後文件內容如下所示:

1240
aaa.png


新增加的這幾個資料夾分別包含了不同的cpu架構,這裡就不詳細介紹。如果要支援所有的cpu架構(包括真機和模擬器),只需要將fat-lame檔案中的內容拖到專案中即可(lame.h和libmp3lame.a)。至此,準備工作完畢。

二、lame的使用

//錄音檔案轉碼
- (void)audio_PCMtoMP3
{
    NSString *recorderSavePath = [self.savedRecordPath absoluteString];
    NSString *audioTemporarySavePath = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) lastObject];
    NSString *mp3FileName = [self.savedRecordPath lastPathComponent];
    mp3FileName = [mp3FileName stringByAppendingString:@".mp3"];
    NSString *mp3FilePath = [audioTemporarySavePath stringByAppendingPathComponent:mp3FileName];

    @try {
        int read, write;

        FILE *pcm = fopen([recorderSavePath cStringUsingEncoding:1], "rb");  //source 被轉換的音訊檔案位置
        fseek(pcm, 4*1024, SEEK_CUR);                                   //skip file header
        FILE *mp3 = fopen([mp3FilePath cStringUsingEncoding:1], "wb");  //output 輸出生成的Mp3檔案位置

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

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

        do {
            read = (int)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);

        } while (read != 0);

        lame_close(lame);
        fclose(mp3);
        fclose(pcm);
    }
    @catch (NSException *exception) {
        NSLog(@"%@",[exception description]);
    }
    @finally {
        NSLog(@"MP3生成成功: %@",mp3FilePath);
        self.savedRecordPath = mp3FilePath.tzl_URL;
    }

}

相關推薦

iOS 音訊 使用lame轉為MP3格式

由於AVAudioRecorder不能錄製編碼為MP3,所以就需要我們將錄音後的音訊檔案格式進行轉換(注意:AV Foundation和Core Audio提供對MP3資料解碼的支援,但是不提供對其進行編碼。所以我們要藉助第三方庫進行MP3編碼)。如何轉換?lame無疑是一個很好的選擇,

CentOS7.4 yum和原始碼安裝ffmpeg 將amr格式音訊mp3

原始碼安裝: 安裝依賴: # yum install nasm yasm 安裝依賴: # wget https://nchc.dl.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz # tar -

android平臺下音訊編碼之編譯LAMEPCM為MP3

ffmpeg實踐學習 目錄 音訊概述 一般來說音訊的裸資料格式就是脈衝編碼調製(PCM)資料。描述一段PCM資料一般需要以下幾個概念:量化格式(sampleFormat)、取樣率(sampleRate)、聲道數(channel)。以CD的音質為例:量化格式為

【原創】音訊-Mp3AMR--轉載請註明出處

一、常見音訊轉碼方案 1.採用阿里雲OSS進行轉碼 採用阿里雲OSS僅支援amr -> mp3格式的轉碼,但是不支援mp3 -> amr 格式的轉碼,呼叫後會丟擲 amr 格式不支援的異常。OSS轉碼為非同步轉碼,呼叫時是通知OSS的轉碼服務,將

iOS拼接URL,類似安卓body體進行轉為gbk)提交。

大家都知道,AFN去提交POST的時候是不用給他拼接URL的,但是♪(^∇^*),如果說你要對這個後面的body體進行轉碼的話,如果不拼接就無法實現了,還有一個就是如果安卓那邊url的確是拼接出來的,那麼我iOS不拼接的話,只有一個結果。。。那就是請求不到資料咯! 我用一個

如何將FLAC格式轉為MP3格式

align 比較 分享圖片 自己 宋體 局限 多個 註冊登錄 span   FLAC是一種無損壓縮格式,也就是說音頻以FLAC編碼壓縮後不會丟失任何信息,並且將FLAC文件還原後與壓縮前的文件內容相同。由於FLAC的無損壓縮性質導致它所占儲存空間也很大,特別對於喜歡聽音樂的

C# 使用 ffmpeg 進行音訊

先放一下 ffmpeg 的官方文件以及下載地址: 官方文件:http://ffmpeg.org/ffmpeg.html 下載地址:http://ffmpeg.org/download.html 用 ffmpeg 進行轉碼很簡單,全部都用預設引數的話用下面這句就行: ff

使用gulp將檔案至utf-8格式

在前兩篇文章中,我除了看《MySQL必知必會》之外,還參考了《SQL基礎教程(第2版)》。但是把參考這本書裡的SQL語句導進新建的資料庫時遇到了點麻煩:我在執行SQL檔案後發現表中中文字元全部亂碼。在檢查檔案格式之後發現,隨書給出的SQL檔案的編碼是GB2312……那就先得把這麼些檔案轉成utf-8格式才能適

使用gulp將文件至utf-8格式

合同 sam tab fault 類型 教程 pack htm 目錄 在前兩篇文章中,我除了看《MySQL必知必會》之外,還參考了《SQL基礎教程(第2版)》。但是把參考這本書裏的SQL語句導進新建的數據庫時遇到了點麻煩:我在運行SQL文件後發現表中中文字符全部亂碼。在檢查

瀏覽器音訊相容和ffmpeg的音訊使用

1、百度搜索瀏覽器對於音訊檔案的相容,排在前面的文章大部分是複製貼上很久以前的文章,容易誤導搜尋資料的人, 因此重新驗證整理下。   以Firefox瀏覽器為例,Firefox對於mp3格式音訊的支援在釋出版本21時就已經支援了(2013年)。 下載Firefox各個版本,然後在audio標籤上引入mp3

java視訊格式,設定編碼格式

專案上傳後的視訊不能在video標籤裡面播放,視訊格式是MP4。重新編碼之後就可以了 package com.video.util; import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.FFmpe

騰訊視訊,把qlv格式轉換成mp4格式

     最近需要在公眾號上傳視訊,但是大於20M的視訊需要到騰訊視訊上傳,在騰訊視訊上下載的視訊是qlv格式,要在騰訊視訊上傳必須是其他主流視訊格式,如mp4這樣的,真是坑。所以就需要我把視訊轉換格式,但是在格式工廠等都不能轉,而有個迅捷視訊轉換非VIP使用者只有一次轉換同

海思arm平臺AAC音訊cpu佔用高、效率低的問題解決

問題背景 目前市面上的大部分IPC攝像機音訊輸出基本都是G711、G726編碼格式,而在類似於《基於EasyNVR實現RTSP/Onvif監控攝像頭Web無外掛化直播監控》這種業務中,都是在類似於EasyNVR這樣的適配服務中進行音訊的轉碼,也有在類似於《Ea

ffmpeg音訊,採用swr_convert重取樣

/* *最簡單的音訊轉碼器(只處理音訊) *繆國凱 Mickel *[email protected] *本程式實現從一個視訊格式轉碼到另一個視訊格式,只處理音訊,視訊忽略,若有多個音訊流,只處理第一個,採用swr_convert重取樣 *2015-5-8 */ #include "stdaf

FFmpeg音訊總結

最近自己在做音訊轉碼的事情。剛開始是想通過ffmpeg的示例程式來學習,可是比較複雜,短時間內看的頭昏腦脹。索性在網上搜索關於轉碼的例子。還是在雷神的部落格裡找到了類似的示例程式,地址是:http://blog.csdn.net/leixiaohua1020/article

ios 漢字 (漢字與utf8、Unicode與漢字

Unicode轉化為漢字: + (NSString *)replaceUnicode:(NSString *)unicodeStr {           NSString *tempStr1 = [unicodeStrstringByReplacingOccurrencesOfString:@"\\u

使用ffmpegpcm至aac格式

準備工作 去官網下載原始碼自己編譯所需要的庫,或者直接從官網下載已經編寫好的庫,由於本例是Window平臺下的開發,而官網已經有了編譯好的庫,所以直接下載編譯所需要的庫檔案即可。下載地址:需要下載兩個壓縮包,Dev版本和Shared版本,其中Dev版本是標頭檔案和lib庫檔

IOS 實現使用lame庫 錄音MP3格式 邊錄邊功能

在iOS中使用AVAudioRecorder無法錄製MP3格式的音訊檔案,雖然你可能會看到過這樣一個列舉: CF_ENUM(AudioFormatID) { kAudioFormatLinearPCM = 'lpcm',

113.將音訊化為MP3格式(lame庫)

為什麼要轉化音訊格式 最近又在做即時通訊了, 關於語音錄製的檔案總是那麼幾個型別的, 但想要與 Android 實現音訊互通. 那麼就要轉化Mp3格式的音訊檔案或者Amr 格式檔案. 當然Amr是最好,因為同等時長下, amr檔案資料大小是最小的, 非常適合移

錄音(PCM格式)、播放、lameMP3

/**  *  音訊轉碼,由PCM轉碼為MP3  */ - (void)convertToMP3 {     NSString * mp3FileName = @"sendRecord.mp3";     NSString * documentPath = [NSSearchPathForDirecto