FFMPEG4.0音頻解碼解封裝

FFMPEG 4.0 for Android 準備工作

成都創新互聯公司專注于寧化企業網站建設,成都響應式網站建設公司,商城網站制作。寧化網站建設公司,為寧化等地區提供建站服務。全流程定制網站,專業設計,全程項目跟蹤,成都創新互聯公司專業和態度為您提供的服務

下面的函數方法基于最新的FFMPEG 4.0(4.X):

音頻的原始數據是pcm編碼,關于PCM編碼的相關信息請看這篇文章:https://www.jianshu.com/p/cfb3d4dc3676

本文的解碼就是要把原始文件中的音頻部分提取出來解碼生成PCM文件,以下是正文,將會去除邏輯相關代碼,按照流程順序用最基礎的方法展現,方便大家掌握用法:

一、獲取多媒體文件的信息
1.聲明并分配內存格式信息的Context
avformat_context = avformat_alloc_context();
2.打開文件讀取頭信息
avformat_open_input(&avformat_context,src_name,NULL,NULL);其中avformat_context如果沒有被聲明分配內存,此方法會給分配。
3.某些格式沒有頭信息,需要讀取數據來分析
avformat_find_stream_info(avformat_context,NULL);
二、解碼設置
4.找到你想要的數據流,可用方法av_find_best_stream代替:

    int audio_stream_index = 0;
    //like av_find_best_stream
    for(i = 0;i<avformat_context->nb_streams;i++) {
        if(avformat_context->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
            audio_stream_index = i;
            av_log(NULL,AV_LOG_ERROR,"find audio stream index = %d\n",audio_stream_index);
            break;
        }
    }
    AVStream *stream = avformat_context->streams[audio_stream_index];

5.從數據流信息中得到×××信息,生成×××
codec = avcodec_find_decoder(stream-&gt;codecpar-&gt;codec_id);
6.聲明解碼Context。
codec_ctx = avcodec_alloc_context3(codec);
7.把stream信息中的參數拷貝到解碼Context中。
ret = avcodec_parameters_to_context(codec_ctx,stream-&gt;codecpar);
8.打開×××
avcodec_open2(codec_ctx, codec, NULL);
三、進行數據流解封裝解碼
9.聲明數據包packet與數據幀frame

    frame = av_frame_alloc();
    pkt = av_packet_alloc();

10.讀取數據包
av_read_frame(avformat_context,pkt)
11.發送數據包
avcodec_send_packet(codec_ctx,pkt);
12.接收解碼后的數據幀,需要注意的是一個數據包可能解壓出多個數據幀,所以需要循環讀取
avcodec_receive_frame(codec_ctx,frame)//讀取一幀
一個packet的解碼范例:

    while((ret = avcodec_receive_frame(codec_ctx,frame)) >= 0) {
        if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
            return;
        int data_size = av_get_bytes_per_sample(codec_ctx->sample_fmt);
        LOGV("data_size = %d,line0 = %d,codec_ctx->channels = %d\n",data_size * frame->nb_samples,frame->linesize[0],codec_ctx->channels);
        int i,ch = 0;
        for(i = 0;i<frame->nb_samples;i++)
        {
            for(ch = 0;ch<codec_ctx->channels;ch++)
            {
                fwrite(frame->extended_data[ch] + data_size*i,1,data_size,outfile);
            }
        }
    }

13.每種采樣格式的數據大小都是固定的
int data_size = av_get_bytes_per_sample(codec_ctx->sample_fmt);得到的是此格式每個采樣的字節大小。
frame->linesize[0]內存儲的是frame單聲道的字節大小,=data_size*frame->nb_samples
14.解碼得到的每幀數據都有多個樣本,每幀數據可能有多個通道
//下面的代碼針對的是planar類型格式。

        for(i = 0;i<frame->nb_samples;i++)
        {
            for(ch = 0;ch<codec_ctx->channels;ch++)
            {
                fwrite(frame->extended_data[ch] + data_size*i,1,data_size,outfile);
            }
        }

音頻格式存儲分為兩種類型,分別為packed和planar,區別為格式后面是否帶p
帶P和不帶P的數據類型的區別:

P表示Planar(平面),聲道分開存放。其數據格式排列方式為 :*
LLLLLLRRRRRRLLLLLLRRRRRRLLLLLLRRRRRRL...(每個LLLLLLRRRRRR為一個音頻幀)
而不帶P的數據格式(即交錯排列)排列方式為:
LRLRLRLRLRLRLRLRLRLRLRLRLRLRLRLRLRLRL...(每個LR為一個音頻樣本)

目前的音頻一般是planar格式,packed格式的數據存在一列之中,左右聲道交替存放。
planar格式聲道的數據存在各自的數組中,生成PCM文件時需要注意左右聲道加起來才是一個完整的采樣點。
對于音頻,使用extended_data,data注意是給視頻用的,雖然單純的音頻文件在聲道較少時也是能用的,但是官方不推薦用。

當前名稱:FFMPEG4.0音頻解碼解封裝
文章URL:http://m.kartarina.com/article8/gesjop.html

成都網站建設公司_創新互聯,為您提供微信公眾號網站設計面包屑導航電子商務自適應網站網站導航

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

網站托管運營
主站蜘蛛池模板: 国产热の有码热の无码视频| 人妻少妇精品无码专区二区 | 亚洲大尺度无码无码专线一区| 无码国模国产在线无码精品国产自在久国产 | 亚洲日韩中文字幕无码一区| 日韩AV无码久久一区二区| 国产午夜鲁丝无码拍拍| 未满十八18禁止免费无码网站| 无码人妻视频一区二区三区| 精品久久久久久无码不卡| 亚洲中文字幕无码av永久| 日韩免费a级毛片无码a∨| 日韩精品无码免费专区午夜不卡| 亚洲AV无码国产精品麻豆天美| 无码一区二区三区在线| 免费无码午夜福利片69| 国产av无码专区亚洲av桃花庵 | 亚洲人成无码网WWW| 中文字幕乱偷无码AV先锋| 亚洲性无码AV中文字幕| 国产成人无码区免费内射一片色欲| 久久久久精品国产亚洲AV无码| 亚洲欧洲无码一区二区三区| 国产精品无码素人福利不卡| 人妻少妇偷人精品无码| 人妻AV中出无码内射| 国产乱人伦中文无无码视频试看 | 成人午夜精品无码区久久| 无码av人妻一区二区三区四区| 国产精品无码久久久久久久久久| 亚洲情XO亚洲色XO无码| 少妇无码太爽了不卡视频在线看 | 午夜无码一区二区三区在线观看| 中文无码成人免费视频在线观看| 无码中文字幕乱码一区| 亚洲日韩精品无码专区加勒比☆ | 无码欧精品亚洲日韩一区| 久久精品无码专区免费| 国产精品va无码二区| 亚洲国产精品无码久久98| 久久久久亚洲Av片无码v|