安装完成ffmpeg后,就可以使用ffmpeg进行音频文件格式转换。比如 ./ffmpeg -i /media/1.mp3 /media/1.wav, 通过该命令行可以将/media文件夹下1.mp3文件转换成WAV格式的。

但是反过来 ./ffmpeg -i /media/1.WAV /media/1.MP3 却不能转换成Mp3格式,提示如下错误(找不到编码器):
    Stream mapping:
    Stream #0:0 -> #0:0 (wav -> ?)
    Encoder (codec none) not found for output stream #0:0
    如果强行指定编码器 ./ffmpeg -i /media/1.wav -acodec mp3 /media/1.mp3, 仍提示找不到编码器错误:
    Unknown encoder 'mp3'

这是因为,ffmpeg虽然是个开源软件,但因为具体格式的版权原因,它并没有包含所有的编解码格式,或者有个格式只有对应的解码器,但没有编码器,比如 Mp3就只有解码器,能播放Mp3文件,但却没有Mp3的编码器,无法将其它格式转换成Mp3。可以通过命令行 ./ffmpeg -codecs 查询编解码配置,第一个D表示Decoder,该格式能够解码;E表示Encoder,该格式可以编码。从中可以看出Mp3不能编码,Mp2倒是即可解码 也可编码。如何解决这个问题呢?    
D A D  mp1             MP1 (MPEG audio layer 1)
D A D  mp1float        MP1 (MPEG audio layer 1)
DEA D  mp2             MP2 (MPEG audio layer 2)
D A D  mp2float        MP2 (MPEG audio layer 2)
D A D  mp3             MP3 (MPEG audio layer 3)
D A D  mp3adu          ADU (Application Data Unit) MP3 (MPEG audio layer 3)
D A D  mp3adufloat     ADU (Application Data Unit) MP3 (MPEG audio layer 3)

我的第一个方法是自己写代码来完成。源码文件中,Allcodecs.c中对各个格式进行注册,先修改Mp3的注册行,改为同时注册解码器和编码器:
    REGISTER_ENCDEC  (MP2, mp2);
    REGISTER_DECODER (MP2FLOAT, mp2float);
    REGISTER_DECODER (MP3, mp3)  // 此行修改为 REGISTER_ENCDEC  (MP3, mp3)
    然后新增Mp3编码器的实现Struct,里面Init函数、encode函数、close函数使用Mp2的函数,因为我也不知道如何去实现Mp3的函数,或者说到代码实现级我也不知道Mp3和Mp2的区别在哪。
    AVCodec ff_mp3_encoder = {
    .name           = "mp3",
    .type           = AVMEDIA_TYPE_AUDIO,
    .id             = CODEC_ID_MP3,
    .priv_data_size = sizeof(MpegAudioContext),
    .init           = MPA_encode_init,
    .encode         = MPA_encode_frame,
    .close          = MPA_encode_close,
    .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE},
    .supported_samplerates= (const int[]){44100, 48000,  32000, 22050, 24000, 16000, 0},
    .long_name = NULL_IF_CONFIG_SMALL("MP3 (MPEG audio layer 3)"),
    .defaults       = mp3_defaults,
};
    重新编译上线。 用命令行./ffmpeg -i /media/1.WAV /media/1.MP3 试了一下,能成功生成1.mp3文件,文件也能播放。似乎没有问题了,单用 file /media/1.mp3 查看了一下,发现文件不是Mp3格式的,而是Mp2格式的:
    /media/1.mp3: MPEG ADTS, layer II, v1, 128 kbps, 44.1 kHz, Stereo
    很遗憾,自行修改代码的方式行不通,因为不是每个编解码格式协议的专家,自行修改代码失败的风险很大,不仅是Mp3,还有一些其他格式比如AMR OGG H.263是没有编码器的。所以,第二个方案,使用成熟的第三方编码器和ffmpeg结合。

Mp3比较好的开源第三方库是libmp3lame(简称Lame)。我下了一个最新版本(3.99.4)的Lame源码,编译它:
    首先配置: ./configure --prefix=/shared --enable-shared --enable-static
    然后编译:  make
               make install
    生成文件: 动态链接库 /shared/lib/libmp3lame.so 和 静态链接库 /shared/lib/libmp3lame.a。这里只需要使用动态链接库,将.so文件拷贝到/lib中,这个文件夹是动态链接库的默认搜索路径, 让ffmpeg运行时可以找到。
    然后对ffmpeg配置libmp3lame: ./configure --enable-libmp3lame
    重新编译ffmpeg,运行转化命令,看看效果如何。
    首先执行 ./ffmpeg -codecs 查看可用编解码的变化,可以看到多出了libmp3lame编码器,带E的:
    D V D  lagarith        Lagarith lossless
    EA    libmp3lame      libmp3lame MP3 (MPEG audio layer 3)
    EV    ljpeg           Lossless JPEG
    D V D  loco            LOCO
    然后执行 ./ffmpeg -i /media/1.WAV /media/1.MP3, 生成1.mp3,用File命令查看,确实是Mp3文件。
    /media/1.mp3: Audio file with ID3 version 2.4.0, contains: MPEG ADTS, layer III, v1, 128 kbps, 44.1 kHz, Stereo
    大功告成,问题解决。
    也可在命令行中指定编解码生成Mp3文件:./ffmpeg -i /media/1.WAV -acodec libmp3lame /media/1.MP3.

ffmpeg 将音频转为mp3问题解决相关推荐

  1. 如何将m4a格式音频转为mp3?

    如何将m4a格式音频转为mp3?如果你是苹果手机用户,那么你可能会发现一个问题,当我们将苹果手机的录音文件放到其它设备上时,可能会出现无法打开播放的情况,这是因为格式不被兼容的原因所引起的.苹果手机的 ...

  2. java后台 amr格式音频转为mp3格式

    最近项目用到读取amr格式的音频,但是h5不支持这种格式,前台处理不太擅长感觉太过麻烦,所以还是在后端转格式吧. 用到一个jar: jave.jar 网址:https://www.sauronsoft ...

  3. amr格式音频转为mp3格式

    最近项目用到读取amr格式的音频,但是h5不支持这种格式,网上有一些是通过插件的方式来读取,amrlib.js之类,但是不擅长前端,而且有一些插件是要求把文件转为base64编码格式,然后把这些bas ...

  4. jave.jar amr格式音频转为mp3格式 部署linux会有一个问题 转换出来的MP3文件是0k

    jave就是封装了一层对外部ffmpeg的调用. 而windows上能转换是因为:ffmpeg.exe 这个程序没问题. 而Linux上转换失败也是因为 ffmpeg 这个可能版本太老或依赖库缺失. ...

  5. 在java中使用ffmpeg将amr格式的语音转为mp3格式

    ffmpeg是一个非常强大的音视频处理工具,官网是:http://ffmpeg.org/ . 由于ffmpeg在windows上和linux系统上的执行文件不一样(Windows上不需要安装ffmpe ...

  6. android ios语音转码,iOS 音频转码 使用lame转为MP3格式

    由于AVAudioRecorder不能录制编码为MP3,所以就需要我们将录音后的音频文件格式进行转换(注意:AV Foundation和Core Audio提供对MP3数据解码的支持,但是不提供对其进 ...

  7. Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件

    Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 目录 利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 1.先下载ff ...

  8. 【Android FFMPEG 开发】Android 中使用 FFMPEG 将 PCM 音频采样转为 MP3 格式

    文章目录 一.前置操作 ( 移植 FFMPEG ) 二.FFMPEG 将 PCM 采样转为 MP3 格式的命令 三.Android FFMPEG 混音源代码完整示例 四.博客源码 一.前置操作 ( 移 ...

  9. ffmpeg 解码音频(aac、mp3)输出pcm文件

    ffmpeg 解码音频(aac.mp3)输出pcm文件 播放pcm可以参考: ffplay -ar 48000 -ac 2 -f f32le out.pcm main.c #include <s ...

最新文章

  1. MySQL数据库Raid存储方案
  2. Codeforces Round #572 (Div. 2)(ABCD1D2E)
  3. 光纤收发器的优势介绍
  4. 写一些脚本的心得总结系列第3篇------同步数据到其他表
  5. 云服务器文件传输问题
  6. 软件测试项目时间一般多少钱,项目的时间进度该如何估算?
  7. 为什么保险公司一直不停地招人?
  8. 这次,python将带你自动爬取B站CXK的NBA形象大使的全部鬼畜视频
  9. 离散数学 06.05 同构及同态
  10. 使用U盘安装win7系统遇到“缺少所需的 CD/DVD 驱动器设备驱动程序”解决办法
  11. 介绍一个牛逼的Github项目
  12. UI小知识——色彩的分类
  13. psycopg2.pool.PoolError: connection pool exhausted
  14. C语言:scandir函数用法:枚举目录中指定的文件
  15. Pycharm 一键加引号、批量加引号
  16. Google谷歌权重09年算法
  17. Android 9.0系统恢复出场设置源码流程分析
  18. 四川店盈通电子商务有限公司:十荟团热潮退却,泡沫消失
  19. 中科大MEM工程管理硕士专业考研初试与复试经验分享
  20. debian 图形界面安装及无线网卡驱动 Broadcom BCMXX系列

热门文章

  1. display指定端口linux,Linux DISPLAY作用
  2. Java word和txt文件转换图片
  3. 资源3(ZY3)号卫星NAD-FWD数据制作DEM
  4. 切身经历,经理都慌了!云服务器连接成功蓝屏,桌面没有任何图标显示
  5. Silverlight游戏研发手记:(三)蜂窝拓扑结构在SLG地图布局中的应用
  6. 程序人生:2023年,软件测试还吃香吗?学软件测试还有前途吗?
  7. 2018研究生数学建模心路历程
  8. 修改t3报表服务器,t3财务报表设置服务器
  9. 信息技术教育与计算机技术的区别,信息技术=计算机技术?!
  10. DDS (Data Distribution Service) 数据分发服务-规范中文翻译_003