首页 资讯 应用 高压 设计 行业 低压 电路图 关于

嵌入式

旗下栏目: PLC 嵌入式 单片机 DCS

ffmpeg实现的pcm采样率转换

嵌入式 | 发布时间:2018-03-03 | 人气: | #评论# | 本文关键字:ffmpeg,pcm采样率,转换
摘要://pcm_sample_cvt.cpp:定义控制台应用程序的入口点。 // #includestdafx.h #include windows.h #include sys /stat.h #include time.h #include stdint.h #include stdlib.h externC { #include libavcodec /avcodec.h #include libavformat /avformat.h
  1. // pcm_sample_cvt.cpp : 定义控制台应用程序的入口点。  

  2. //  

  3.   

  4. #include "stdafx.h"  

  5. #include <windows.h>  

  6. #include <sys/stat.h>   

  7. #include <time.h>  

  8. #include <stdint.h>  

  9. #include <stdlib.h>  

  10.  

  11. extern "C"    

  12. {    

  13. #include <libavcodec/avcodec.h>    

  14. #include <libavformat/avformat.h>    

  15. //#include <libavfilter/avfiltergraph.h>    

  16. //#include <libavfilter/avcodec.h>    

  17. //#include <libavfilter/buffersink.h>    

  18. //#include <libavfilter/buffersrc.h>    

  19. //#include <libavutil/opt.h>    

  20. //#include <libavutil/pixdesc.h>    

  21. }    

  22.   

  23. #include <string>  

  24.   

  25. /************************************************************/    

  26.     

  27. /****函数功能:音视频解码并重采样为规定采样率的WAV文件**************/    

  28.     

  29. /****作者:dreamboy*******************************************/    

  30.     

  31. /****参数:**************************************************/    

  32.     

  33. /****1.outfilename:输出WAV文件路径***************************/    

  34.     

  35. /****2.sample_rate:输出WAV文件的采样率***********************/    

  36.     

  37. /****3.channels:输出WAV文件的通道数量************************/    

  38.     

  39. /****4.inputfilename:输入WAV文件路径************************/    

  40.     

  41. /****说明:当sample_rate或channels为0是表示,   

  42.    

  43.                该参数在输入文件基础上保持不变  

  44.                // 只支持采集点为16位的,即 aCodecCtx->sample_fmt=AV_SAMPLE_FMT_S16  

  45.                // 如果源文件 采样率和通道数本为16000kHz、1,则不进行转换  

  46.                ******************/    

  47.     

  48. int AudioConvertFunc(const char *outfilename,int sample_rate,int channels,const char *inputfilename)    

  49. {    

  50.  AVCodec *aCodec =NULL;    

  51.  AVPacket *packet = NULL;    

  52.  AVFormatContext *pFormatCtx =NULL;    

  53.     AVCodecContext *aCodecCtxNULL;    

  54.  ReSampleContext* ResampleCtx=NULL;    

  55.  AVFrame *decoded_frame = NULL;    

  56.  int datasize;    

  57.     

  58.  unsigned int i;    

  59.  int len, ret, buffer_size, count, audio_stream_index = -1, totle_samplenum = 0;    

  60.     

  61.  FILE *outfile = NULL;// *infile;    

  62.  //head_pama pt;    

  63.     

  64.  int16_t *audio_buffer = NULL;    

  65.  int16_t *resamplebuff = NULL;    

  66.  int ResampleChange=0;    

  67.  int ChannelsChange=0;    

  68.      

  69.     

  70.  packet = (AVPacket*)malloc(sizeof(AVPacket));    

  71.  if (packet==NULL)    

  72.  {    

  73.   return -1;    

  74.  }    

  75.  packet->data=NULL;    

  76.     

  77.  buffer_size = AVCODEC_MAX_AUDIO_FRAME_SIZE * 2;    

  78.  audio_buffer = (int16_t *)av_malloc(buffer_size);    

  79.  if (audio_buffer==NULL)    

  80.  {    

  81.   if (packet->data!=NULL)    

  82.   {    

  83.    av_free_packet(packet);    

  84.    packet->data=NULL;    

  85.   }    

  86.   if (packet!=NULL)    

  87.   {    

  88.    free(packet);    

  89.    packet=NULL;    

  90.   }    

  91.   return -2;    

  92.  }    

  93.      

  94.  av_register_all();    

  95.     

  96.  av_init_packet(packet);    

  97.     

  98.  //pFormatCtx = avformat_alloc_context();    

  99.  ret = avformat_open_input(&pFormatCtx, inputfilename, NULL,NULL);    

  100.    

  101.  if(ret < 0)    

  102.  {    

  103.   if (audio_buffer!=NULL)    

  104.   {    

  105.    av_free(audio_buffer);    

  106.    audio_buffer=NULL;    

  107.   }    

  108.       

  109.   if (packet->data!=NULL)    

  110.   {    

  111.    av_free_packet(packet);    

  112.    packet->data=NULL;    

  113.   }    

  114.   if (packet!=NULL)    

  115.   {    

  116.    free(packet);    

  117.    packet=NULL;    

  118.   }    

  119.   if (pFormatCtx!=NULL)    

  120.   {    

  121.    av_close_input_file(pFormatCtx);    

  122.    pFormatCtx=NULL;    

  123.   }    

  124.       

  125.   return 1;      

  126.  }    

  127.     

  128.  ret = av_find_stream_info(pFormatCtx);    

  129.     

  130.  if( ret < 0)    

  131.  {    

  132.   if (audio_buffer!=NULL)    

  133.   {    

  134.    av_free(audio_buffer);    

  135.    audio_buffer=NULL;    

  136.   }    

  137.     

  138.   if (packet->data!=NULL)    

  139.   {    

  140.    av_free_packet(packet);    

  141.    packet->data=NULL;    

  142.   }    

  143.   if (packet!=NULL)    

  144.   {    

  145.    free(packet);    

  146.    packet=NULL;    

  147.   }    

  148.   if (pFormatCtx!=NULL)    

  149.   {    

  150.    av_close_input_file(pFormatCtx);    

  151.    pFormatCtx=NULL;    

  152.   }    

  153.     

  154.   return 2;    

  155.  }    

  156.     

  157.  audio_stream_index=-1;    

  158.  for(i=0; i< (signed)pFormatCtx->nb_streams; i++)    

  159.  {    

  160.     

  161.   if(pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO && audio_stream_index < 0)    

  162.   {    

  163.    audio_stream_index = i;    

  164.    break;    

  165.   }    

  166.  }    

  167.     

  168.  if(audio_stream_index == -1)    

  169.  {    

  170.   if (audio_buffer!=NULL)    

  171.   {    

  172.    av_free(audio_buffer);    

  173.    audio_buffer=NULL;    

  174.   }    

  175.     

  176.   if (packet->data!=NULL)    

  177.   {    

  178.    av_free_packet(packet);    

  179.    packet->data=NULL;    

  180.   }    

  181.   if (packet!=NULL)    

  182.   {    

  183.    free(packet);    

  184.    packet=NULL;    

  185.   }    

  186.   if (pFormatCtx!=NULL)    

  187.   {    

  188.    av_close_input_file(pFormatCtx);    

  189.    pFormatCtx=NULL;    

  190.   }    

  191.     

  192.   return 3;    

  193.  }    

  194.     

  195.  aCodecCtx = pFormatCtx->streams[audio_stream_index]->codec;    

  196.  if (aCodecCtx==NULL)    

  197.  {    

  198.   if (audio_buffer!=NULL)    

  199.   {    

  200.    av_free(audio_buffer);    

  201.    audio_buffer=NULL;    

  202.   }    

  203.     

  204.   if (packet->data!=NULL)    

  205.   {    

  206.    av_free_packet(packet);    

  207.    packet->data=NULL;    

  208.   }    

  209.   if (packet!=NULL)    

  210.   {    

  211.    free(packet);    

  212.    packet=NULL;    

  213.   }    

  214.   if (pFormatCtx!=NULL)    

  215.   {    

  216.    av_close_input_file(pFormatCtx);    

  217.    pFormatCtx=NULL;    

  218.   }    

  219.   return 4;    

  220.  }    

  221.  aCodec = avcodec_find_decoder(aCodecCtx->codec_id);    

  222.  if(!aCodec)     

  223.  {    

  224.   if (audio_buffer!=NULL)    

  225.   {    

  226.    av_free(audio_buffer);    

  227.    audio_buffer=NULL;    

  228.   }    

  229.     

  230.   if (packet->data!=NULL)    

  231.   {    

  232.    av_free_packet(packet);    

  233.    packet->data=NULL;    

  234.   }    

  235.   if (packet!=NULL)    

  236.   {    

  237.    free(packet);    

  238.    packet=NULL;    

  239.   }    

  240.   if (pFormatCtx!=NULL)    

  241.   {    

  242.    av_close_input_file(pFormatCtx);    

  243.    pFormatCtx=NULL;    

  244.   }    

  245.   /*if (aCodecCtx!=NULL)   

  246.   {   

  247.    avcodec_close(aCodecCtx);   

  248.    aCodecCtx=NULL;   

  249.   }*/    

  250.   return 5;    

  251.  }    

  252.  //resample init    

  253.  if (channels==0)    

  254.  {    

  255.   channels=aCodecCtx->channels;    

  256.  }    

  257.  if (sample_rate==0)    

  258.  {    

  259.   sample_rate=aCodecCtx->sample_rate;    

  260.  }    

  261.  //if (aCodecCtx->channels!=channels)    

  262.  //{    

  263.  // ChannelsChange=1;    

  264.  // ResampleChange=1;    

  265.  //}    

  266.  if (aCodecCtx->sample_rate!=sample_rate||aCodecCtx->channels!=channels)    

  267.  {    

  268.   ResampleChange=1;    

  269.  }    

  270.  if (ResampleChange==1)   

  271.  {    

  272.      //ResampleCtx = av_audio_resample_init(channels,aCodecCtx->channels,sample_rate,aCodecCtx->sample_rate,aCodecCtx->sample_fmt,aCodecCtx->sample_fmt,8,10,0,1.0);  

  273.        

  274.   ResampleCtx = av_audio_resample_init(channels,aCodecCtx->channels,sample_rate,aCodecCtx->sample_rate,AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_S16,16,10,0,1.0);    

  275.   if (ResampleCtx==NULL)    

  276.   {    

  277.    if (audio_buffer!=NULL)    

  278.    {    

  279.     av_free(audio_buffer);    

  280.     audio_buffer=NULL;    

  281.    }    

  282.     

  283.    if (packet->data!=NULL)    

  284.    {    

  285.     av_free_packet(packet);    

  286.     packet->data=NULL;    

  287.    }    

  288.    if (packet!=NULL)    

  289.    {    

  290.     free(packet);    

  291.     packet=NULL;    

  292.    }    

  293.    if (pFormatCtx!=NULL)    

  294.    {    

  295.     av_close_input_file(pFormatCtx);    

  296.     pFormatCtx=NULL;    

  297.    }    

  298.    /*if (aCodecCtx!=NULL)   

  299.    {   

  300.     avcodec_close(aCodecCtx);   

  301.     aCodecCtx=NULL;   

  302.    }*/    

  303.    ResampleChange=0;    

  304.    return 6;    

  305.   }    

  306.   resamplebuff=(int16_t *)malloc(buffer_size);    

  307.   if (resamplebuff==NULL)    

  308.   {    

  309.    if (audio_buffer!=NULL)    

  310.    {    

  311.     av_free(audio_buffer);    

  312.     audio_buffer=NULL;    

  313.    }    

  314.     

  315.    if (packet->data!=NULL)    

  316.    {    

  317.     av_free_packet(packet);    

  318.     packet->data=NULL;    

  319.    }    

  320.    if (packet!=NULL)    

  321.    {    

  322.     free(packet);    

  323.     packet=NULL;    

  324.    }    

  325.    if (pFormatCtx!=NULL)    

  326.    {    

  327.     av_close_input_file(pFormatCtx);    

  328.     pFormatCtx=NULL;    

  329.    }    

  330.    /*if (aCodecCtx!=NULL)   

  331.    {   

  332.     avcodec_close(aCodecCtx);   

  333.     aCodecCtx=NULL;   

  334.    }*/    

  335.        

  336.    if (ResampleChange==1&&ResampleCtx!=NULL)    

  337.    {    

  338.     audio_resample_close(ResampleCtx);    

  339.     ResampleCtx=NULL;    

  340.    }    

  341.    return 7;    

  342.   }    

  343.  }    

  344. int sec=0;// 单位秒  

  345. if (pFormatCtx->duration>0)// 文件播放时长  

  346. {  

  347.     sec = pFormatCtx->duration/1000000;  

  348. }  

  349.   

  350.  datasize=sec*sample_rate;    

  351.  if(avcodec_open(aCodecCtx, aCodec)<0)    

  352.  {    

  353.   if (audio_buffer!=NULL)    

  354.   {    

  355.    av_free(audio_buffer);    

  356.    audio_buffer=NULL;    

  357.   }    

  358.     

  359.   if (packet->data!=NULL)    

  360.   {    

  361.    av_free_packet(packet);    

  362.    packet->data=NULL;    

  363.   }    

  364.   if (packet!=NULL)    

  365.   {    

  366.    free(packet);    

  367.    packet=NULL;    

  368.   }    

  369.   if (pFormatCtx!=NULL)    

  370.   {    

  371.    av_close_input_file(pFormatCtx);    

  372.    pFormatCtx=NULL;    

  373.   }    

  374.   if (aCodecCtx!=NULL)    

  375.   {    

  376.    avcodec_close(aCodecCtx);    

  377.    aCodecCtx=NULL;    

  378.   }    

  379.     

  380.   if (ResampleChange==1&&ResampleCtx!=NULL&&resamplebuff!=NULL)    

  381.   {    

  382.    audio_resample_close(ResampleCtx);    

  383.    ResampleCtx=NULL;    

  384.    free(resamplebuff);    

  385.    resamplebuff=NULL;    

  386.   }    

  387.   ResampleChange=0;    

  388.   return 8;    

  389.  }    

  390.     

  391.  //pt.bits = 16;    

  392.  //pt.channels = channels;    

  393.  //pt.rate = sample_rate;    

  394.     

  395.  outfile = fopen(outfilename, "wb");    

  396.  if (!outfile)     

  397.  {    

  398.   if (audio_buffer!=NULL)    

  399.   {    

  400.    av_free(audio_buffer);    

  401.    audio_buffer=NULL;    

  402.   }    

  403.     

  404.   if (packet->data!=NULL)    

  405.   {    

  406.    av_free_packet(packet);    

  407.    packet->data=NULL;    

  408.   }    

  409.   if (packet!=NULL)    

  410.   {    

  411.    free(packet);    

  412.    packet=NULL;    

  413.   }    

  414.   if (pFormatCtx!=NULL)    

  415.   {    

  416.    av_close_input_file(pFormatCtx);    

  417.    pFormatCtx=NULL;    

  418.   }    

  419.   if (aCodecCtx!=NULL)    

  420.   {    

  421.    avcodec_close(aCodecCtx);    

  422.    aCodecCtx=NULL;    

  423.   }    

  424.     

  425.   if (ResampleChange==1&&ResampleCtx!=NULL&&resamplebuff!=NULL)    

  426.   {    

  427.    audio_resample_close(ResampleCtx);    

  428.    ResampleCtx=NULL;    

  429.    free(resamplebuff);    

  430.    resamplebuff=NULL;    

  431.   }    

  432.   ResampleChange=0;    

  433.   return 9;    

  434.  }    

  435.     

  436.  fseek(outfile,44,SEEK_SET);    

  437.     

  438.     while(av_read_frame(pFormatCtx, packet) >= 0)     

  439.  {    

  440.   //CheckMessageQueue();    

  441.      if(packet->stream_index == audio_stream_index)    

  442.      {    

  443.    //while(packet->size > 0)    

  444.    //{    

  445.     buffer_size = AVCODEC_MAX_AUDIO_FRAME_SIZE * 100;    

  446.     len = avcodec_decode_audio3(aCodecCtx, audio_buffer, &buffer_size, packet);    

  447.     

  448.     if (len < 0)     

  449.     {    

  450.      break;    

  451.     }    

  452.     

  453.     if(buffer_size > 0)    

  454.     {    

  455.      //resample    

  456.      if (ResampleChange==1)    

  457.      {    

  458.       int samples=buffer_size/ ((aCodecCtx->channels) * 2);    

  459.       int resamplenum0;    

  460.       resamplenum = audio_resample(ResampleCtx,     

  461.        resamplebuff,     

  462.        audio_buffer,     

  463.        samples);    

  464.       count = fwrite(resamplebuff, 2*channels, resamplenum, outfile);    

  465.      }    

  466.          

  467.      else    

  468.      {    

  469.       count = fwrite(audio_buffer, 2*aCodecCtx->channels, buffer_size/((aCodecCtx->channels)*2), outfile);    

  470.      }    

  471.      totle_samplenum += count;    

  472.     }    

  473.     if (packet->data!=NULL)    

  474.     {    

  475.      av_free_packet(packet);    

  476.      packet->data=NULL;    

  477.     }    

  478.     //packet->size -len;    

  479.     //packet->data += len;    

  480.    //}    

  481.    if (datasize!=0&&totle_samplenum>=datasize)    

  482.    {    

  483.     break;    

  484.    }    

  485.      }    

  486.  }    

  487.     

  488.  fseek(outfile,0,SEEK_SET);    

  489. //wav_write_header(outfile, pt, totle_samplenum);    

  490.   

  491.  if (outfile!=NULL)    

  492.  {    

  493.   fclose(outfile);    

  494.   outfile=NULL;    

  495.  }    

  496.         

  497.  if (audio_buffer!=NULL)    

  498.  {    

  499.   av_free(audio_buffer);    

  500.   audio_buffer=NULL;    

  501.  }    

  502.      

  503.  if (aCodecCtx!=NULL)    

  504.  {    

  505.   avcodec_close(aCodecCtx);    

  506.   aCodecCtx=NULL;    

  507.  }    

  508.      

  509.  if (packet!=NULL)    

  510.  {    

  511.   free(packet);//    

  512.   packet=NULL;    

  513.  }    

  514.      

  515.  if (pFormatCtx!=NULL)    

  516.  {    

  517.   av_close_input_file(pFormatCtx);    

  518.   pFormatCtx=NULL;    

  519.  }    

  520.      

  521.  if (ResampleChange==1)    

  522.  {    

  523.   if (resamplebuff!=NULL)    

  524.   {    

  525.    free(resamplebuff);    

  526.    resamplebuff=NULL;    

  527.   }    

  528.   if (ResampleCtx!=NULL)    

  529.   {    

  530.    audio_resample_close(ResampleCtx);    

  531.    ResampleCtx=NULL;    

  532.   }    

  533.  }    

  534.  if (totle_samplenum<=sample_rate*5)    

  535.  {    

  536.   return 10;    

  537.  }    

  538.  return 0;    

  539. }    

  540. int main(int argc, char **argv)    

  541. {    

  542.     AudioConvertFunc("test_48k_16.wav",48000,1,"test_8k_16.wav");  

  543.   

  544.     return 0;  

  545. }    

责任编辑:PCM

热门文章

首页 | 电气资讯 | 应用技术 | 高压电器 | 电气设计 | 行业应用 | 低压电器 | 电路图 | 关于我们 | 版权声明

Copyright 2017-2018 电气自动化网 版权所有 辽ICP备17010593号-1

电脑版 | 移动版 原创声明:本站大部分内容为原创,转载请注明电气自动化网转载;部分内容来源网络,如侵犯您的权益请发送邮件到[email protected]联系我们删除。