[轉]從ffmpeg中提取mp3播放器

[轉自]http://ffmpeg.blogbus.com/logs/480522.html

 

mp3 和 mp2 的核心實現在 mpegaudiodec.c 裏。

如果不需要其它解碼只要mpeg聲音的解碼的話,其接口相當簡單。一個是初始化函數 decode_init,另一個是真正的幀解碼函數 decode_frame.

int decode_init(AVCodecContext * avctx)
int decode_frame(AVCodecContext * avctx,void *data, int *data_size,uint8_t * buf, int buf_size)

可以看得出來,用戶只要定義一個 AVCodecContext 的變量,然後將指針傳給這兩個函數就可以了。另外特別值得注意的是 decode_init中第一行代碼是
MPADecodeContext *s = avctx->priv_data;

由於AVCodecContext結構體的priv_data是一個數據空間的指針,如果沒有分配空間那它是指向NULL的,所以你可以選擇malloc一個空間,也可以定義一個全局變量MPADecodeContext MPDctx,然後將指針賦值給avctx->priv_data.我選擇後者,對於管理內存,太麻煩,也不是俺的強項。

decode_frame 的功能就是解碼完一幀就返回,返回值表明使用了緩衝區中多少數據。當然如果傳入的數據不夠解碼一幀也會返回,但是data_size爲0。這裏介紹一下decode_frame的後面幾個參數,buf和buf_size是指傳入的mpeg聲音壓縮碼流的緩衝區地址和緩衝區大小,而data和是指解碼出來的pcm數據要存放的地址,*data_size是解碼出的pcm數據大小,一般爲0或者1152x4. 除了data_size,decode_frame的另外四個參數都爲輸入型參數.

據此,我們可以寫一個main.c來實現一個播放器了。

AVCodecContext t_avcc;
MPADecodeContext t_mpadc;
int main(int argc,char *argv[]){
     t_avcc.priv_data=&t_mpadc;

     decode_init(&t_avcc);

     此處加入打開mp3文件的指針file_mp3;

  while(!feof(file_mp3)){
    int len;
    unsigned char buf[4096],*buf_ptr;
    int buf_size;
    unsigned char data[1152*8];
    int data_size;
    /* 這個read函數不保證正確,憑感覺寫的:(*/
    buf_size=read(buf,file_mp3,4096);
    while(buf_size>0){
      buf_ptr=buf;
      len=decode_frame(&t_avcc,data,&data_size,buf_ptr,buf_size);
      if(len<0)
        break;
      此處加入對data的處理代碼,寫入文件或者寫到聲卡,隨便
      buf_optr+=len;
      buf_size-=len;
   }
  }
}

發佈了12 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章