使用 libavcodec 将 .m4a 转换为 PCM

2024-01-31

我正在尝试将 .m4a 文件转换为原始 PCM 文件,以便可以在 Audacity 中播放它。

根据 AVCodecContext,它是一个使用示例格式 AV_SAMPLE_FMT_FLTP 的 44100 Hz 轨道,据我了解,当使用 avcodec_decode_audio4 解码时,我应该得到两个浮点值数组(每个通道一个)。

我不确定 AVCodecContext 的 bits_per_coded_sample = 16 的重要性

不幸的是,Audacity 回放结果就好像我将原始曲目与一些白噪声混合在一起一样。

这是我所做的一些示例代码。请注意,我还添加了一个使用签名 16 位非交错数据 (sample_format = AC_SAMPLE_FMT_S16P) 的轨道的情况,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 只能导入 32 位或 64 位浮点(大端或小端)的 RAW 浮点数据。

感谢您的任何见解。


我认为问题出在“nb_samples”中。这不完全是你需要的。最好尝试使用“linesize[0]”。

Example:

char* ptr_l = (char*)frame->extended_data[0];
char* ptr_r = (char*)frame->extended_data[1];
size_t size = sizeof(float);
for (int i=0; i<frame->linesize[0]; i+=size)
{
   fwrite(ptr_l, size, 1, outfile);
   fwrite(ptr_r, size, 1, outfile);
   ptr_l += size;
   ptr_r += size;    
}

它适用于“float”,并对“int16_t”重复相同的操作。但“size”将是“sizeof(int16_t)”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 libavcodec 将 .m4a 转换为 PCM 的相关文章

  • 使用 ffmpeg 进行视频标准化

    无论如何 有没有使用 ffmpeg 脚本将视频亮度标准化为其完整的动态范围 我一直在尝试用 lutyuv 这样做 ffmpeg i input mp4 vf lutyuv y val minval 255 maxval minval 输出
  • 使用 Javascript 播放音频元素 (html5)

    我正在尝试弄清楚如何触发从 javascript 播放音频 我得到了一些 html 看起来像 div class audio foo div
  • 我可以从带时间戳的图像创建 VFR 视频吗?

    首先 我对图像制作视频的经验几乎为零 我拥有的是一组带有 BMP 时间戳的图像 我想从中生成视频 由于时间戳的间隔不相等 我不能简单地使用从图像创建恒定帧速率视频的软件 一个可能的解决方案是在固定的时间间隔创建人造图像 但如果我无法制作 V
  • Java - 调整 WAV 文件的播放速度

    我可能很笨 但我似乎找不到解决我的问题的方法 NOTE 我发现很多人报告了这个问题 似乎它是由于较新的 Java 可能是 1 5 而发生的 也许不再支持 SAMPLE RATE 我无法找到任何解决方案 我正在尝试调整 SAMPLE RATE
  • ffmpeg drawtext如何设置从右到左的方向

    i write arabic text to videos and it works fine but the issue is that the arabic language is written from right to left
  • 使用 DirectSound 向后读取声音

    是否可以使用 DirectSound 的托管版本向后读取声音 如果没有 是否有另一个库可以轻松实现 您可以使用 WaveFileReader 和 WaveFileWriter 类NAudio http www codeplex com na
  • 使用 ffmpeg 转换真实媒体

    我有许多旧的硬壳真实媒体文件需要转换 并希望编写一个脚本来批量处理它们 我可以使用 FFMpegX 进行 Real Media gt AVI 转换 但是当我尝试使用 ffmpeg 复制转换时 它总是会出现如下错误 avi 0x10084fa
  • 在 Mobile Safari 中重用 HTML5 音频对象

    我希望在 iPad 上的 Mobile Safari 中运行的 Web 应用程序上播放一个简短 小于 1 秒 的音频文件 以响应用户输入 同时将事件和音频播放之间的延迟降至最低 在页面重新加载之间可以多次触发播放 因此我想缓存音频文件 以下
  • Objective C - 音频延迟估计的互相关

    我想知道是否有人知道如何执行互相关两个音频信号之间iOS 我想将接收器 我正在从麦克风接收信号 处获得的 FFT 窗口与发射器处 正在播放音轨 处的 FFT 窗口对齐 即确保每个窗口的第一个样本 除了发射机的 同步 周期之外 也将是接收机的
  • 为什么我的音频不倒带?

    我在 Javascript 中倒带音频时遇到了一些问题 我基本上有一个倒计时 当倒计时接近结束时 每秒都会发出蜂鸣声 我尝试使用 var bip new Audio http www soundjay com button beep 7 w
  • NAudio 音调变换

    我正在使用 NAudio DLL 并且正在寻找音调变换声音的示例代码 有一个使用的例子NAudio https github com naudio NAudio用于开源中的音高变换Skype 变声器 https github com mar
  • 如何低延迟地使用 Android 音频

    Problem 您可能听说过 Android 不提供低延迟音频 API 我所说的低延迟音频是指您应该能够从麦克风获取音频信号并播放声音 中间没有太多时间间隔 例如 5 7 毫秒 我尝试过旧的java 带有AudioRecord和AudioT
  • 第一次播放声音时 AVAudioPlayer 启动缓慢

    我试图消除通过 iPhone 上的 AVAudioPlayer 播放 非常短 不到 2 秒 音频文件时的启动延迟 首先 代码 NSString audioFile NSString stringWithFormat caf NSBundle
  • 解码子级时访问嵌套 Codable 结构中父级结构的属性

    在嵌套中使用解码器时Codablestruct 有什么方法可以访问父结构的属性吗 我能想到的唯一可行的方法 尚未测试 是在父结构中也使用手动解码器 在userInfo字典 然后访问userInfo在子结构中 但这会产生大量样板代码 我希望有
  • 我们可以从 MFCC 系数中恢复音频吗?

    可以从 MFCC 系数中获取音频信号吗 另外 MFCC 系数是否有一个值范围 如果有的话 是什么 如果没有 如何将其归一化在 0 到 1 之间 我尝试使用以下 MATLAB 代码 http labrosa ee columbia edu m
  • 通话过程中是否可以拦截语音数据?

    我计划开发 Android 应用程序 对语音数据进行加密 解密 以便各方可以使用安全通道进行通信 那么问题来了 GSM通话时如何拦截语音 音频数据 可能还是不可能 我应该使用 Android NDK 还是其他东西 在 GSM 中 由于信道特
  • OpenAL 初始化问题,仅限 iPod(?)

    我遇到了 OpenAL 问题 似乎只发生在 iPod 硬件上 奇怪的是它was工作正常 但现在不行了 我正在设置音频会话 AVAudioSession sharedInstance setCategory AVAudioSessionCat
  • F1 2019 UDP解码

    我目前正在为 F1 方向盘开发自己的显示器 F1 2019 由codemasters提供 通过UDP发送数据 该数据存储在字节数组中 我在解码返回的数组时遇到一些问题 问题是我得到了很多信息 但我不知道如何处理它们 我将向您介绍我所尝试过的
  • 使用 ffmpeg 提取帧的最快方法?

    您好 我需要使用 ffmpeg 从视频中提取帧 有没有比这更快的方法 ffmpeg i file mpg r 1 1 filename 03d jpg 如果 JPEG 编码步骤对性能要求太高 您可以始终将未压缩的帧存储为 BMP 图像 ff
  • VLC 和 ffmpeg 如何协同工作?

    我从源代码编译了VLC 它运行良好 当我执行 Vlc 时 vlc 运行 我还从源代码编译了 ffmpeg 它也运行良好 当我执行 ffmpeg i f toto flv mp3 vn acodec copy new toto mp3 时 会

随机推荐

  • Sql Server 2008 - 换行符和全文查询

    我有一个数据库和一个全文索引表 我们称这张表为test 该表有一个名为testfield 现在 我们只插入一条记录 如下所示 insert into test values word Char 13 test 该查询插入一个带有LINE B
  • 如何选择 numpy 二维数组中唯一元素的所有位置及其周围的边界框?

    我有一个 2D numpy 数组 我想找到所有唯一元素的 每个 位置 我们可以使用以下方法找到独特的元素numpy unique numpyarray 这是棘手的部分 现在我必须知道每个独特元素的所有位置 让我们考虑以下示例 array 1
  • MySQL自动增量加上一列中的字母数字

    我是来自 Oracle 的 MySQL 新手 我需要创建一个表 其中主键位于一列中 但格式如下 X A注明原产国的信件 例如S对于西班牙来说 Z津巴布韦等 我们只有五个原籍国 YYYYMMDD 该格式的日期 9999 4 位办公代码 999
  • 奇怪的超时::控制器操作中的 render_to_string 和 HTTParty 出现错误

    在我的控制器操作中 我使用带有 jbuilder 模板的 render to string 来将 http post 操作的对象渲染到 API 此 API 调用的结果是控制器应该渲染的结果 但是在通过 render to string 渲染
  • Apache Commons Math 的标准差

    我正在使用 Apache Commons Math 计算向量的 SD 问题 我得到的值与手工得到的值不同 DescriptiveStatistics stats new DescriptiveStatistics stats addValu
  • iOS 10 iMessage 贴纸应用中 MSSticker Peels 的回调

    我正在 iOS 10 中尝试贴纸 iMessage 应用程序 但遇到了问题override func didStartSending message MSMessage conversation MSConversation 中的方法MSM
  • 数据绑定布局约束

    我在添加要查看的结束约束时遇到问题
  • Blazor 导航:更新 URL 而不更改重新加载页面

    我在应用程序中使用 URL 参数来表示页面状态 如何在不实际导航的情况下更改 URL Thanks 使用 Blazor 服务器端 您可以使用 JS Interop 来完成此操作并调用history pushState null url 这是
  • 禁用日期选择器弹出窗口中的过去日期

    我有下面的代码片段 其中有日期选择器控件
  • LinearLayoutManager.findFirstVisibleItemPosition() 返回 POSITION_NONE

    我正在尝试做这样的事情 RecyclerAdapter recyclerAdapter LinearLayoutManager recyclerManager set items recyclerAdapter notifyDataSetC
  • 在方向更改时保持列表片段选定项目的位置

    我在另一个片段的左侧有一个列表片段 本质上是标准的单击一个项目并更新右侧的片段模式 当他们单击列表片段中的一项时 他们正在选择新闻文章类别 我需要保留他们旋转设备时选择的任何一项 我怎么做 我当前的代码不起作用 我的代码如下 public
  • Django 1.7+ 相当于 South 的 add_ignored_fields() 是什么?

    回到 Django 的早期版本 我们都使用 South 进行迁移 并且由于它没有我们希望的那么智能 我们有时需要告诉它显式忽略某些字段 因为这些字段太复杂而无法处理 我们这样做是用add ignored fields一切都很顺利 在我们的例
  • 正确地从 DOM 中删除角度组件

    我创建了一个芯片组件 它有一个删除按钮 单击此按钮后 我想从 DOM 中删除整个组件 包括它的包装 HTML 标记 芯片组件 ts Component selector app chips template div class close
  • 在我的 Mac 上制作一个 C 启动器

    我想为我制作的 C 程序制作一个启动器 并且希望它在终端中运行 我该怎么做 我连一丁点的想法都没有 只需创建一个文本文件 将其保存到桌面 例如my C program command 注意 command后缀 然后在文本文件中您可以输入您喜
  • 从右到左的 UI 指南?

    我正在研究对专有 UI 框架 用于桌面应用程序 的 RTL 支持 我想知道 是否有关于如何更改小部件渲染的指南 我正在寻找诸如以下内容的列表 复选框标签位于复选框的左侧 并且右对齐 工具栏按钮从右向左流动 垂直滑块位于左侧 窗户装饰 一般布
  • 用于在 Google 电子表格中保存 URL 的书签

    我想创建一个简单的书签 它获取当前网页 location ref 的 URL 并将其保存在 Google 电子表格中 保存后 我想留在当前网页 我知道写入 Google 电子表格的唯一方法是使用 Google App Script 所以我写
  • JUnit 5 测试套件的 Surefire XML 测试报告

    我刚刚迁移到 JUnit 5 在我的测试套件的 XML 测试报告中看不到任何测试用例 我已经使用 junit platform suite 的新 JUnit 5 语法编写了测试套件 并且套件中的测试均成功运行 这将通过 Surefire 生
  • 为什么“初始化元素不是常量”......不再起作用?

    static const int a 42 static const int b a 我预计这样的代码会出现编译错误 初始值设定项必须是常量表达式或字符串文字 存储在具有以下类型的对象中的值int with const类型限定符不是常量表达
  • Jest 26 和 Angular - 错误行号报告不正确

    自从升级到 Jest 26 和 Angular 10 以来 单元测试错误行号的报告不正确 我从 Angular 4 开始就一直使用 Jest 并且随着每个新版本的升级 我已经阅读了所有关于此的现有文章 并尝试了我能找到的所有建议 它们似乎都
  • 使用 libavcodec 将 .m4a 转换为 PCM

    我正在尝试将 m4a 文件转换为原始 PCM 文件 以便可以在 Audacity 中播放它 根据 AVCodecContext 它是一个使用示例格式 AV SAMPLE FMT FLTP 的 44100 Hz 轨道 据我了解 当使用 avc