ffmpeg 保存avcodec_decode_audio4解码后的PCM数据

我想要一个。M4A文件转换为原始PCM文件,这样我可以发挥它放回勇气。 按照AVCodecContext中它是一个44100赫兹的采样格式AV_SAMPLE_FMT_FLTP其中,据我了解,当avcodec_decode_audio4,我应该得到浮点值(每个通道一个)的两个数组。 我不确定的AVCodecContext中的bits_per_coded_sample=16的意义 不幸的是Audacity的播放结果回来,如果我有原来的轨道混在白噪声。 下面是我一直在做的示例代码。请注意,我还添加了轨道签名16位非交错数据(sample_format=AC_SAMPLE_FMT_S16P)的情况下 CodeGo.net,这Audacity的播放罚款。
int AudioDecoder::decode(std::string path)
{
 const char* input_filename=path.c_str();
 av_register_all();
 AVFormatContext* container=avformat_alloc_context();
 if(avformat_open_input(&container,input_filename,NULL,NULL)<0){
 printf("Could not open file");
 }
 if(avformat_find_stream_info(container, NULL)<0){
  printf("Could not find file info");
 }
 av_dump_format(container,0,input_filename,false);
 int stream_id=-1;
 int i;
 for(i=0;i<container->nb_streams;i++){
 if(container->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){
  stream_id=i;
  break;
 }
 }
 if(stream_id==-1){
 printf("Could not find Audio Stream");
 }
 AVDictionary *metadata=container->metadata;
 AVCodecContext *ctx=container->streams[stream_id]->codec;
 AVCodec *codec=avcodec_find_decoder(ctx->codec_id);
 if(codec==NULL){
 printf("cannot find codec!");
 }
 if(avcodec_open2(ctx,codec,NULL)<0){
  printf("Codec cannot be found");
 }
 AVSampleFormat sfmt = ctx->sample_fmt;
 AVPacket packet;
 av_init_packet(&packet);
 AVFrame *frame = avcodec_alloc_frame();
 int buffer_size = AVCODEC_MAX_AUDIO_FRAME_SIZE+ FF_INPUT_BUFFER_PADDING_SIZE;;
 uint8_t buffer[buffer_size];
 packet.data=buffer;
 packet.size =buffer_size;
 FILE *outfile = fopen("test.raw", "wb");
 int len;
 int frameFinished=0;
 while(av_read_frame(container,&packet) >= 0)
 {
  if(packet.stream_index==stream_id)
  {
  //printf("Audio Frame read \n");
  int len=avcodec_decode_audio4(ctx, frame, &frameFinished, &packet);
  if(frameFinished)
  {  
   if (sfmt==AV_SAMPLE_FMT_S16P)
   { // Audacity: 16bit PCM little endian stereo
   int16_t* ptr_l = (int16_t*)frame->extended_data[0];
   int16_t* ptr_r = (int16_t*)frame->extended_data[1];
   for (int i=0; i<frame->nb_samples; i++)
   {
    fwrite(ptr_l++, sizeof(int16_t), 1, outfile);
    fwrite(ptr_r++, sizeof(int16_t), 1, outfile);
   }
   }
   else if (sfmt==AV_SAMPLE_FMT_FLTP)
   { //Audacity: big endian 32bit stereo start offset 7 (but has noise)
   float* ptr_l = (float*)frame->extended_data[0];
   float* ptr_r = (float*)frame->extended_data[1];
   for (int i=0; i<frame->nb_samples; i++)
   {
    fwrite(ptr_l++, sizeof(float), 1, outfile);
    fwrite(ptr_r++, sizeof(float), 1, outfile);
    }
   }   
  }
 }
}
fclose(outfile);
av_close_input_file(container);
return 0; 
} 我希望我刚刚做了一个天真的转换(最/少显著位的问题),但目前我一直无法弄清楚。需要注意的是Audacity的只能当导入RAW浮点数据的32位或64位浮点(或大或小端)。 感谢您的任何见解。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值