1. 程式人生 > >【FFmpeg(2016)】PCM編碼AAC

【FFmpeg(2016)】PCM編碼AAC

【前言】

本文章主要是將 PCM原始資料編碼為AAC。

測試檔案則是上一篇文章生成的PCM檔案:

音訊資料format分很多種型別,16bit,32bit等,而2016 ffmpeg只支援最新的AAC格式,32bit,也就是AV_SAMPLE_FMT_FLTP。

所以,想對PCM進行編碼得先確保PCM是AV_SAMPLE_FMT_FLTP型別的。

【AAC封裝格式】

AAC有兩種封裝格式,分別是ADIF ADTS,多與流媒體一般使用ADTS格式。見:

【FFmpeg資料結構】

  1. AVCodecContext  
  2. AVCodec  
  3. AVCodecID  
  4. AVFrame  
  5. AVPacket  
對PCM檔案的讀寫直接使用FILE檔案指標。

AVCodec是一個編碼器,可以單純的理解為一個編解碼演算法的結構。


AVCodecContext是AVCodec的一個上下文,打個比如,在視訊編碼h264時,有i p b三種幀,如果有一個視訊流是 I B B P這種順序到達,由於B幀需要依靠前後的幀來計算出本幀現實的內容,所有需要一些buffer儲存一些,以根據這些來計算出B幀的內容,當然還有很多其他的內容。


AVCodecID是編碼器的ID,如編碼AAC是,就使用AV_CODEC_ID_AAC。


AVFrame 是編碼前、解碼後儲存的資料。
AVPacket是編碼後、解碼前儲存的資料。

關於官方定義的AVFrame:

  1. typedefstruct AVFrame {  
  2. #define AV_NUM_DATA_POINTERS 8
  3.     /** 
  4.      * pointer to the picture/channel planes. 
  5.      * This might be different from the first allocated byte 
  6.      * 
  7.      * Some decoders access areas outside 0,0 - width,height, please
     
  8.      * see avcodec_align_dimensions2(). Some filters and swscale can read 
  9.      * up to 16 bytes beyond the planes, if these filters are to be used, 
  10.      * then 16 extra bytes must be allocated. 
  11.      * 
  12.      * NOTE: Except for hwaccel formats, pointers not needed by the format 
  13.      * MUST be set to NULL. 
  14.      */
  15.     uint8_t *data[AV_NUM_DATA_POINTERS];  
  16.     /** 
  17.      * For video, size in bytes of each picture line. 
  18.      * For audio, size in bytes of each plane. 
  19.      * 
  20.      * For audio, only linesize[0] may be set. For planar audio, each channel 
  21.      * plane must be the same size. 
  22.      * 
  23.      * For video the linesizes should be multiples of the CPUs alignment 
  24.      * preference, this is 16 or 32 for modern desktop CPUs. 
  25.      * Some code requires such alignment other code can be slower without 
  26.      * correct alignment, for yet other it makes no difference. 
  27.      * 
  28.      * @note The linesize may be larger than the size of usable data -- there 
  29.      * may be extra padding present for performance reasons. 
  30.      */
  31.     int linesize[AV_NUM_DATA_POINTERS];  
  32.     /** 
  33.      * pointers to the data planes/channels. 
  34.      * 
  35.      * For video, this should simply point to data[]. 
  36.      * 
  37.      * For planar audio, each channel has a separate data pointer, and 
  38.      * linesize[0] contains the size of each channel buffer. 
  39.      * For packed audio, there is just one data pointer, and linesize[0] 
  40.      * contains the total size of the buffer for all channels. 
  41.      * 
  42.      * Note: Both data and extended_data should always be set in a valid frame, 
  43.      * but for planar audio with more channels that can fit in data, 
  44.      * extended_data must be used in order to access all channels. 
  45.      */
  46.     uint8_t **extended_data;  
  47.     ......其他成員  
  48. } AVFrame;  

對於視訊,目前比較流行的是H264壓縮標準,好像沒見過其他編碼方式,而H264只能由YUV影象編碼,也就是說H264解碼後就是三個YUV分量,他們的資料會分別存在,data[0],data[1],data[2] ,而linesize[0],linesize[1],linesize[2]分別代表各個資料的長度。

對於音訊,由於有多聲道的音訊,那麼音訊解碼出來的資料不同聲道也儲存在不同的指標,如data[0]是左聲道,data[1]是右聲道,由於各個聲道的資料長度是一樣的,所以linesize[0]就代表了所有聲道資料的長度。

成員extended_data則指向了data,是一個拓展,上面可以看到data 是包含8個指標的陣列,也就是說對於音訊,最多隻支援8個聲道。

【程式碼】

  1. extern"C"
  2. {  
  3. #include "libavformat/avformat.h"
  4. #include "libavutil/avutil.h"
  5. #include "libavcodec/avcodec.h"
  6. #include "libavutil/frame.h"
  7. #include "libavutil/samplefmt.h"
  8. #include "libavformat/avformat.h"
  9. #include "libavcodec/avcodec.h"
  10. }  
  11. #pragma comment(lib, "avcodec.lib")
  12. #pragma comment(lib, "avfilter.lib")
  13. #pragma comment(lib, "avformat.lib")
  14. #pragma comment(lib, "avutil.lib")
  15. /* PCM轉AAC */
  16. int main()  
  17. {  
  18.     char *padts = (char *)malloc(sizeof(char) * 7);  
  19.     int profile = 2;                                            //AAC LC
  20.     int freqIdx = 4;                                            //44.1KHz
  21.     int chanCfg = 2;            //MPEG-4 Audio Channel Configuration. 1 Channel front-center
  22.     padts[0] = (char)0xFF;      // 11111111     = syncword
  23.     padts[1] = (char)0xF1;      // 1111 1 00 1  = syncword MPEG-2 Layer CRC
  24.     padts[2] = (char)(((profile - 1) << 6) + (freqIdx << 2) + (chanCfg >> 2));  
  25.     padts[6] = (char)0xFC;  
  26.     AVCodec *pCodec;  
  27.     AVCodecContext *pCodecCtx = NULL;  
  28.     int i, ret, got_output;  
  29.     FILE *fp_in;  
  30.     FILE *fp_out;  
  31.     AVFrame *pFrame;  
  32.     uint8_t* frame_buf;  
  33.     int size = 0;  
  34.     AVPacket pkt;  
  35.     int y_size;  
  36.     int framecnt = 0;  
  37.     char filename_in[] = "audio.pcm";  
  38.     AVCodecID codec_id = AV_CODEC_ID_AAC;  
  39.     char filename_out[] = "audio.aac";  
  40.     int framenum = 100000;  
  41.     avcodec_register_all();  
  42.     pCodec = avcodec_find_encoder(codec_id);  
  43. 相關推薦

    FFmpeg(2016)PCM編碼AAC

    【前言】 本文章主要是將 PCM原始資料編碼為AAC。 測試檔案則是上一篇文章生成的PCM檔案: 音訊資料format分很多種型別,16bit,32bit等,而2016 ffmpeg只支援最新的AAC格式,32bi

    noip 2016普及組

    scrip one clu sel b+ -s 位置 ref print T1.買鉛筆 題目鏈接 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4

    SDOI 2016 排列計數

    include bits span 因此 遞推公式 tar printf for 遞推 【題目鏈接】 https://www.lydsy.com/JudgeOnline/problem.php?id=4517 【算法】 有m個數在

    Office 2016Excel 批量刪除行

    bad 空值 技術分享 bfd -o shadow ctrl color ctrl+ 問,我如何批量刪除我不要的數據?答,1、原始數據標記的(#......),都要做一次性刪除,如果這個數據的處理,我們當然可以手動,如果是過千條的數據,可能就會眼花繚亂,Office的確是一

    神經網絡編碼聚類算法--DEC (Deep Embedded Clustering)

    arr ole 參加 這也 criterion dia one ims 方法 1.算法描述 最近在做AutoEncoder的一些探索,看到2016年的一篇論文,雖然不是最新的,但是思路和方法值得學習。論文原文鏈接 http://proceedings.mlr.p

    神經網路編碼聚類演算法--DEC (Deep Embedded Clustering)

    1.演算法描述      最近在做AutoEncoder的一些探索,看到2016年的一篇論文,雖然不是最新的,但是思路和方法值得學習。論文原文連結 http://proceedings.mlr.press/v48/xieb16.pdf,論文有感於t-SNE演算法的t-

    軟體工程程式編碼

    前言: 編碼階段也就是建築的施工階段,比如施工牆,樑,板。 一、程式編碼的總原則 1、先求正確後求快 2、先求清晰後求快 3、求快不忘保持程式正確 4、保持程式整潔以求快 5、不要因效率而犧牲清晰 二、好程式的標準 1、易於測試和除錯 2、易於維護 3、易於修改 4、設計簡單

    Python學習字元編碼

    先說兩個基礎知識。 (1)計算機內部,資料是由0,1組成的; (2)計算機最小的資料單位,就是一個二進位制單位即bit,接下來就是8個二進位制單位表示一個位元組(Byte)。 1 ASCII碼 ASCII碼(American Standard Code for Information Intercha

    貪心演算法Huffman編碼

    問題描述 有一組字符集{c1, c2, …, cn},在使用這組字符集的過程中,通過統計發現每個字元都有其相應的出現頻率,假設對應的頻率為{f1, f2, …, fn}。現在需要對這些字元進行二進位制編碼,我們希望的編碼結果如下:每個字元都有其獨一無二的編碼;

    資料壓縮Huffman編碼

    1. 壓縮編碼概述 資料壓縮在日常生活極為常見,平常所用到jpg、mp3均採用資料壓縮(採用Huffman編碼)以減少佔用空間。編碼\(C\)是指從字元空間\(A\)到碼字表\(X\)的對映。資料壓縮編碼指編碼後資訊的長度較於原始資訊要短。本文試圖探討Huffman編碼是如何保證唯一可譯性、如何壓縮、以及壓縮

    Objective-C OC編碼規範

    UserModel 的命名方式不太好。Model 是設計模型中的概念,不應該將其命名到具體的程式碼物件中,而且型別必須要有字首,防止命名衝突,此處命名字首取 BDK(Bai Du Knows)。: 和 NSObject 之間要有空格。屬性定義的地方 property / 括號 / 型別 / 變數名 之間應該要

    計算機導論程式編碼與簡單輸入/輸出

    1. 編譯程式和解釋程式 有兩種型別的翻譯程式可以將程式猿寫的程式程式碼翻譯為機器程式碼:編譯程式和解釋程式。 編譯程式:將整個原始碼轉換為機器程式碼,只有在原始碼全部被翻譯以後,計算機才開始執行程式。 解釋程式:每翻譯一行就執行一行,一次只執行一行。

    使用ffmpeg轉碼pcmaac格式

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

    CJOJ2616 HZOI 2016偏序 I(cdq分治,樹狀數組)

    %d solution math include set getc file r++ fin 傳送門 CJOJ Solution 考慮這是一個四維偏序對吧。 直接cdq套在一起,然後這題有兩種實現方法(樹狀數組的更快!) 代碼實現1(cdq+cdq+cdq) /* ma

    Java基礎編碼問題不再困惑你

    目錄 1. ASCII編碼 2. Unicode編碼 3. UTF-8編碼 4. UTF8、UTF16和UTF32之間的區別 5. GBK、GB2312和GB18030之間的區別

    基於FFmpeg-4.0 SDK的PCM編碼AAC

    1. 初始化 AVCodecContext *m_avctx; AVCodec *m_codec; /* Init ffmpeg log */ ffmpeg_log_callback pcb_log = l

    基於FFmpeg-4.0 SDK的PCM編碼AAC

    1. 初始化 AVCodecContext *m_avctx; AVCodec *m_codec; /* Init ffmpeg log */ ffmpeg_log_callback

    最簡單的基於FFMPEG的音訊編碼器(PCM編碼AAC

                    本文介紹一個最簡單的基於FFMPEG的音訊編碼器。該編碼器實現了PCM音訊取樣資料編碼為AAC的壓縮編碼資料。編碼器程式碼十分簡單,但是每一行程式碼都很重要。通過看本編碼器的原始碼,可以瞭解FFMPEG音訊編碼的流程。本程式使用最新版的類庫(編譯時間為2014.5.6),開發平

    新版ffmpeg PCM編碼AAC,swr_convert轉換取樣精度,稍微修改相容PCM編碼為G711A及MP3,記錄下。

    #include "stdafx.h" #include <stdio.h> #include <iostream> using namespace std; extern "C" { #include "libavformat/avformat.h" #incl

    FFMpeg視訊開發與應用基礎二、呼叫FFmpeg SDK對YUV視訊序列進行編碼

    《FFMpeg視訊開發與應用基礎——使用FFMpeg工具與SDK》視訊教程已經在“CSDN學院”上線,視訊中包含了從0開始逐行程式碼實現FFMpeg視訊開發的過程,歡迎觀看!連結地址:FFMpeg視訊開發與應用基礎——使用FFMpeg工具與SDK