使用 ffmpeg api 调用将 3gp (amr) 转换为 mp3

2024-04-07

使用 ffmpeg api 调用将 3gp (amr) 转换为 mp3

我尝试使用 libavformat (ffmpeg) 构建自己的函数,将 3gp 音频文件(用 Android 移动设备录制)转换为 mp3 文件。

我使用 av_read_frame() 从输入文件读取帧并使用 avcodec_decode_audio3() 解码数据 到缓冲区中,并使用该缓冲区通过 avcodec_encode_audio 将数据编码为 mp3。 这似乎为我提供了将 wav 转换为 mp3 和 mp3 转换为 wav (或解码一个 mp3 并编码为另一个 mp3)的正确结果,但不适用于 amr 到 mp3。 我生成的 mp3 文件似乎具有正确的长度,但仅包含噪音。

在另一篇文章中,我读到 amr-decoder 不使用与 mp3 相同的样本格式。 AMR 使用 FLT 和 mp3 S16 或 S32,我必须进行重新采样。 因此,我为已解码的每个帧调用 av_audio_resample_init() 和 audio_resample。 但这并不能完全解决我的问题。现在我可以听到我录制的声音并且听不懂我在说什么,但是质量很低并且仍然有很多噪音。 我不确定我是否正确设置了 av_audio_resample 的参数,特别是最后 4 个参数(我认为不是),或者我是否错过了其他内容。

ReSampleContext* reSampleContext = av_audio_resample_init(1, 1, 44100, 8000, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT, 0, 0, 0, 0.0);

while(1)
{
    if(av_read_frame(ic, &avpkt) < 0)
    {
        break;
    }

    out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
    int count;

    count = avcodec_decode_audio3(audio_stream->codec, (short *)decodedBuffer, &out_size, &avpkt);

    if(count < 0)
    {
        break;
    }

    if((audio_resample(reSampleContext, (short *)resampledBuffer, (short *)decodedBuffer, out_size / 4)) < 0)
    {
        fprintf(stderr, "Error\n");
        exit(1);
    }

    out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;

    pktOut.size = avcodec_encode_audio(c, outbuf, out_size, (short *)resampledBuffer);

    if(c->coded_frame && c->coded_frame->pts != AV_NOPTS_VALUE)
    {
        pktOut.pts = av_rescale_q(c->coded_frame->pts, c->time_base, outStream->time_base);
        //av_res
    }

    pktOut.pts = AV_NOPTS_VALUE;
    pktOut.dts = AV_NOPTS_VALUE;

    pktOut.flags |= AV_PKT_FLAG_KEY;
    pktOut.stream_index = audio_stream->index;
    pktOut.data = outbuf;

    if(av_write_frame(oc, &pktOut) != 0)
    {
        fprintf(stderr, "Error while writing audio frame\n");
        exit(1);
    }
}

None

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

使用 ffmpeg api 调用将 3gp (amr) 转换为 mp3 的相关文章

  • 如何找到 Discord 机器人所连接的语音聊天

    我正在制作一个通过语音识别激活的不和谐机器人 我一开始就让他加入语音频道 正在运行 我试图发出命令让他离开 const commando require discord js commando class LeaveChannelComma
  • ffmpeg strftime 对 Windows 没有影响

    我正在尝试使用 ffmpeg 自动标记输出文件的时间戳 这是我的测试命令 ffmpeg exe y loglevel 99 i test mp3 strftime 1 Y ogg 我期望一个名为2020 ogg 然而只得到了 Y ogg 换
  • 是否可以使用 TagLibSharp 从 MP3 文件中删除 Lyrics3v2 标签?

    我想知道是否可以删除歌词3v2使用 MP3 文件中的标签类型标签库夏普 https github com mono taglib sharp图书馆 This http id3 org Lyrics3v2文档说块条目以单词 开头歌词开始 并以
  • swscaler@0dd9e620:已弃用的像素格式,请确保您正确设置了范围”

    我正在使用 FFMpeg 解码 RTSP 视频流 在显示时间 调用cv imshow 我得到以下异常 swscaler 0d55e5c0 已弃用像素格式 请确保您这样做了 正确设置范围 我正在将像素格式从 AV PIX FMT YUVJ42
  • FFmpeg - 找不到 ExecuteBinaryResponseHandler - Android/Java

    我正在尝试制作一个用于反应原生的模块 它将把视频变成 gif 我对 android studios java 几乎没有经验 但我很想了解更多 我在用这个图书馆 https github com WritingMinds ffmpeg and
  • 如何将 ffplay 作为无窗口进程运行?

    我正在运行 ffplay 作为后台进程 它向我的主 UI 进程提供图像数据 我已经设定 SDL VIDEODRIVER dummy 抑制 SDL 窗口中显示的 ffplay 视频 问题是 即使不显示视频输出窗口 ffplay 进程仍然显示为
  • Python 子进程中的 ffmpeg - 无法找到“管道:”的合适输出格式

    尝试通过 Python 使用 ffmpeg 将字幕刻录到视频中 在命令行中工作正常 但是当从 Python 子进程调用时 p subprocess Popen cd Downloads yt ffmpeg i video vf subtit
  • 使用 ffmpeg 处理流的解码数据时出错

    我正在使用以下命令 ffmpeg i video1a flv i video1b flv i video1c flv i video2a flv i video3a flv i video4a flv i video4b flv i vid
  • 有没有简单的方法来提取附件 b 格式的 h264 原始流?

    当我使用命令行使用 ffmpeg 提取视频流时 ffmpeg i 一些文件 vcodec copy an f rawvideo h264 什么 out h264 对于 Adob e Media Encoder 生成的某些媒体文件 只有 m4
  • 如何用C语言播放MP3文件?

    我正在寻找在 C 中播放 MP3 文件的最简单方法 我正在寻找一个库 在其中我可以只调用文件名上的函数 或者一个将运行并退出的可执行文件 请建议 Using FMOD http www fmod org download 跨平台 这应该像这
  • 从 Perl 守护程序运行时,为什么 FFMpeg 在五秒后停止?

    我用 Perl 编写了一个小守护程序 它调用 FFMpeg 对视频进行编码 但编码在 5 秒左右后停止 我用这段代码来启动它 my t echo ffmpeg command gt gt self gt FFMPEG OUTPUT my l
  • 防止 ffmpeg 在降低视频分辨率的同时改变颜色强度

    我有一个用例 我需要缩小规模716x1280mp4 视频到358x640 原件的一半 我使用的命令是 ffmpeg i input mp4 vf scale 640 640 force original aspect ratio decre
  • Android 中的音频交叉淡入淡出

    我正在开发一个媒体播放器用于我的学习目的 我希望在媒体播放器应用程序中具有交叉淡入淡出功能 但我不知道从哪里开始 我尝试在互联网上搜索但没有运气 我使用的是安卓MediaPlayer所有媒体播放器相关操作的类 任何人都知道任何解决方法可以实
  • ffmpeg创建RTP流

    我正在尝试使用 ffmpeg 进行编码和流式传输 libavcodec libavformat MSVC x64 with Zeranoe builds 这是我的代码 很大程度上改编自编码示例 删除了错误处理 include stdafx
  • 将每分钟的 MP3 导出为单独的 WAV

    这绝对是一个奇怪的问题 但我正在寻找一种方法 将 60 分钟的 mp3 混合拆分为 60 个单独的 1 分钟长的 wav 文件 以便与 Echonest 等音频指纹识别 API 一起使用 这是否可以在单个 ffmpeg 命令中实现 或者我是
  • 使用快速同步 h264_qsv 编码器时 ffmpeg avcodec_encode_video2 挂起

    当我使用 mpeg4 或 h264 编码器时 我能够使用 ffmpeg 3 1 0 的 API 成功编码图像以生成有效的 AVI 文件 但是 当我使用快速同步编码器 h264 qsv 时 avcodec encode video2 有时会挂
  • 如何从 MP3 文件中提取元数据?

    我已经得到了 MP3 文件的文件名 如何从该 MP3 文件中提取元数据 例如艺术家 专辑 专辑图像等 对于 API 级别 10 或更高级别尝试此操作 MediaMetadataRetriever mmr new MediaMetadataR
  • 如何使用 ffmpeg 提取时间精确的视频片段?

    这并不是一个特别新的问题领域 但我已经尝试过那里建议的内容 但运气不佳 那么 我的故事 我有一大段 15 秒的直接来自camera mov 视频 我想从中提取特定的块 我可以通过开始时间和停止时间 以秒为单位 来识别该块 我首先尝试执行我称
  • iPhone:AVAudioPlayer 不支持的文件类型

    我的应用程序从我们的服务器下载 mp3 并将其播放给用户 该文件为 64 kbps 如果我理解正确的话 这完全在 iPhone 的可接受范围内 我在几十个网站上查找了如何执行此操作 他们都建议我这样做 NSData data NSData
  • 访问 AVFrame 的每个像素

    我需要访问 FFMPEG 的 AVFrame 对象的每个像素信息 如果是 RGB 则每个像素的每种颜色 R G 和 B 我怎样才能做到这一点 如果您已经前进到正确的框架 类似于 img convert ctx ffmpeg sws getC

随机推荐

  • 如何对项目的 cron 作业进行版本控制? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有一堆项目 我用 git 和 fab 推送到服务器 它们是 Django 站点的负载 其中一些站点有 cron 作业 我希望处于这样的境地 通
  • 单击浏览器停止按钮时执行操作

    如果这太简单了 我们深表歉意 我是 JQuery 新手 我搜索并发现了类似的问题this https stackoverflow com questions 11220581 jquery browsers stop button even
  • iOS 和 Android 中的照片库

    我正在开发一个用于移动设备运行的应用程序iOS and Android我在访问时遇到一些困难image gallery的设备与Qml 我需要在一个中列出图片库中的图像GridView 我尝试使用返回图片文件夹QStandardPaths但它
  • (Beautiful Soup) 获取按钮标签内的数据

    我尝试在按钮标签内刮出 ImageId 想要得到结果 25511e1fd64e99acd991a22d6c2d6b6c 当我尝试时 drawing url drawing url find all button class inspectB
  • keydown 事件上的 jQuery 触发器()和 stopPropagation()

    我在按键和停止传播方面遇到了困难 我不想刷新我的页面 我已经尝试了我能想到的所有方法 我当前的代码是 知道我在这里做错了什么吗 我认为事件被正确调用 我有 jquery 和 jquery ui 正确链接并且没有收到控制台错误 UPDATE好
  • ggplot2 中的对数色标会压缩某些图例数字

    我正在尝试创建一个类似于以下问题和回答的情节 ggplot2 中有没有内置的方法可以进行对数色标 https stackoverflow com questions 8069837 is there a built in way to do
  • 如何获取网页的公钥?

    如何获取 VeriSign 等网站以及使用 https 安全协议 的所有其他网站的公钥 这取决于您使用的浏览器 如果您让我知道 我会更新我的答案 Chrome 55 及以上您现在可以在开发人员工具中找到此信息 选项 3 个点 gt 更多工具
  • 为什么必须从继承的类中重新声明虚函数?

    我正在开发一个简单的 C 程序 但很难理解我遇到的编译器错误 该问题是由我尝试从基类创建派生类引起的 我在下面发布了具有相同结构的代码 但更改了名称 基类 h ifndef BASECLASS H define BASECLASS H cl
  • 如何以编程方式获取运行 Android 7.0 的设备中已安装的浏览器应用程序的列表?

    在 Android 7 0 之前 我能够检索已安装的浏览器类型应用程序的列表及其包名称 然后 我升级到 Android 7 0 只能检索三星的互联网浏览器 而不能检索其他浏览器类型的应用程序 例如 Chrome Device 三星 Tab
  • 编译时模板参数计算

    我试图在编译时推断两个模板参数中较大的一个 两个模板参数的类型都是 size t 我有一个模板化类型 SomeType 它采用 size t 作为模板参数 然后 我有一个函数 它采用两个具有不同模板 size t 的 SomeType 参数
  • 如何将 HSQL(基于文件)与我的 Android 应用程序连接?

    您好 我在将 Android 应用程序连接到 HSQLDB 时遇到问题 第一个问题 我应该使用 HSQLDB 的特定 android jar 吗 或者我可以使用任何 HSQL jar 吗 第二个问题 如果我可以使用提供的罐子 我如何才能使连
  • Spring Boot锁定代码以获取唯一id

    我编写了一个必须返回唯一字符串的控制器 要求是该控制器的两次调用永远不会返回相同的字符串 即使经过多年 即使代码将扩展到更多虚拟机 我的问题是以下代码是否正确地实现了声明的目的 或者您是否有任何提示 控制器 RestController p
  • EntityManager 注入导致 NullPointerException

    我正在编写我的第一个 Java EE EJB Servlet 等 应用程序 请注意 我正在使用 Eclipse 我遇到了 EntityManager 注入不起作用的问题 并且由于我的 Java EE 以及一般的 Java 新手 很难找到原因
  • 将特征限制在对象上?

    有没有办法限制一个特征 使其只能混合到对象中 例如 trait OnlyForObjects this gt object Foo extends OnlyForObjects gt OK class Bar extends OnlyFor
  • Angular 路由器 URL 编码特殊字符和浏览器行为

    我只是想不出解决这个问题的办法 我正在设计搜索引擎 我想在 url 中显示用户试图查找的内容 如下所示 https my site com search query 28rockstar search true page 0 用户正在尝试寻
  • 如何为成员使用非默认构造函数?

    我有两节课 class a public a int i class b public b Gives me an error here because it tries to find constructor a a a aInstanc
  • MySQL ONLY IN() 等效子句

    我在这里给出了我的问题的一个非常抽象的版本 所以请耐心等待 我有一个查询将检查特定主体是否具有相同类型的某些多个参数 例如 一个男孩对于巧克力有多种选择 但是 我想从桌子上选择那些拥有我提到的巧克力的男孩 不多不少 也不是 LIKE 或 I
  • 如何从 void 函数返回数据?

    大约一周前 我问了一个有关 activex 和 UDP 的问题 这里是 C UDP Socket 客户端和服务器 https stackoverflow com questions 19786668 c sharp udp socket c
  • Angular.js:在 ng-repeat 中使用 ng-model 进行下拉菜单

    我很难理解如何在 ng repeat 中使用 ng model 在此上下文中 CargoItems 是具有 LoadPoint 的对象的列表 LoadPoint 具有 Id 和 Text 属性 我想显示绑定到下拉列表中当前选择的文本 但我当
  • 使用 ffmpeg api 调用将 3gp (amr) 转换为 mp3

    使用 ffmpeg api 调用将 3gp amr 转换为 mp3 我尝试使用 libavformat ffmpeg 构建自己的函数 将 3gp 音频文件 用 Android 移动设备录制 转换为 mp3 文件 我使用 av read fr