ffmpeg - 如何编译 ffmpeg 以仅获得 mp3 和 mp4 支持
问题描述
我正在构建 Electron 应用程序,我使用 ffmpeg 将 m4a 或 webm 文件转换为 mp3,并将仅视频 mp4 与 m4a 音频文件合并为 mp4。
我可以使用 [media-autobuild-suite] ( https://github.com/jb-alvarado/media-autobuild_suite ),使用轻量级构建选项来实现这一点,但静态文件的大小约为 20mb,我会喜欢再缩小一点。我已经用这个配置编译了 ffmpeg 和 ffprobe。
--disable-libaom
--disable-version3
# Full
--disable-chromaprint
--disable-cuda-sdk
--disable-decklink
--disable-frei0r
--disable-libbs2b
--disable-libcaca
--disable-libcdio
--disable-libfdk-aac
--disable-libflite
--disable-libfribidi
--disable-libgme
--disable-libgsm
--disable-libilbc
--disable-libkvazaar
--disable-libmodplug
--disable-libnpp
--disable-libopenh264
--disable-libopenmpt
--disable-librtmp
--disable-librubberband
--disable-libssh
--disable-libtesseract
--disable-libxavs
--disable-libzmq
--disable-libzvbi
--disable-opencl
--disable-opengl
--disable-libvmaf
--disable-libcodec2
--disable-libsrt
--disable-ladspa
--disable-ffplay
#--enable-vapoursynth
#--enable-liblensfun
--disable-libndi_newtek
--enable-demuxer=mp3
--enable-demuxer=mov
--enable-demuxer=opus
--enable-parser=ac3
--enable-parser=mpegaudio
--enable-parser=h264
--enable-parser=opus
--enable-protocol=file
--enable-protocol=pipe
--enable-decoder=mp3
--enable-decoder=mp4
--enable-decoder=opus
--enable-encoder=mp3
--enable-encoder=mp4
--enable-encoder=opus
使用此配置,我得到 ffmpeg 静态文件 arround 2mb 和 ffprobe 静态文件 arround 2mb 但出现此错误。
C:\Users\Admin\Desktop\ffmpeg compilations\2mb\local64>ffmpeg -i simple.m4a simple.mp3
ffmpeg version N-93147-g9326117bf6 Copyright (c) 2000-2019 the FFmpeg developers built with gcc 8.2.1 (Rev1, Built by MSYS2 project) 20181214
configuration: .... //here comes configuration as described above
libavutil 56. 26.100 / 56. 26.100
libavcodec 58. 47.102 / 58. 47.102
libavformat 58. 26.101 / 58. 26.101
libavdevice 58. 6.101 / 58. 6.101
libavfilter 7. 48.100 / 7. 48.100
libswscale 5. 4.100 / 5. 4.100
libswresample 3. 4.100 / 3. 4.100
libpostproc 55. 4.100 / 55. 4.100
Guessed Channel Layout for Input Stream #0.0 : stereo
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'simple.m4a':
Metadata:
major_brand : dash
minor_version : 0
compatible_brands: iso6mp41
creation_time : 2018-10-31T19:47:32.000000Z
Duration: 00:02:38.92, start: 0.000000, bitrate: 127 kb/s
Stream #0:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, 7 kb/s (default)
Metadata:
creation_time : 2018-10-31T19:47:32.000000Z
handler_name : SoundHandler
[NULL @ 0000000000486200] Unable to find a suitable output format for 'simple.mp3'
simple.mp3: Invalid argument
任何想法我还应该在这个静态文件中包含什么?
解决方案
无需零碎禁用:只需使用--disable-everything
然后启用您需要的东西。
这是一个您可以开始的示例:
./configure
--disable-everything
--disable-network
--disable-autodetect
--enable-small
--enable-decoder=aac*,ac3*,opus,vorbis
--enable-demuxer=mov,m4v,matroska
--enable-muxer=mp3,mp4
--enable-protocol=file
--enable-libshine
--enable-encoder=libshine
--enable-filter=aresample
- 最终的二进制大小约为 2-3 MB。
- 无需启用任何解析器:所选解码器将自动选择所需的解码器。
- FFmpeg 没有原生 MP3 编码器,因此您需要使用外部库,例如 libmp3lame 或 libshine。既然你提到了 Android,我假设你会想要 libshine 而不是 libmp3lame 来编码 MP3。
- 彻底测试。我大概忘记了什么。
- 如果您真的想发疯,请使用
--disable-all
而不是,--disable-everything
您还必须手动包含您想要的 FFmpeg 库,但这是更多的工作和更令人头疼的回报。
这将允许您对来自大多数 M4A 和 Webm 输入的 MP3 音频进行编码:
ffmpeg -i input.webm output.mp3
并且还可以让您将 MP4/M4V + M4A 重新混合到 MP4 中:
ffmpeg -i video.m4v -i audio.m4a -map 0:v -map 0:a -c copy output.mp4
推荐阅读
- macos - 如何解析 MacOS 错误:react-native-vector-icons:compileDebugJavaWithJavac'。反应原生
- javascript - MySQL JSON 搜索提取
- python - 如何在python中有效地比较两个集合列表?
- angular - X 内部调用和 forkJoin 弃用
- javascript - Puppeteer:如何单击其后代中包含特定值的元素
- php - 如果重量大于或等于 224 公斤,则在 Woocommerce 结帐处显示通知
- javascript - 删除文本字符串的某个部分
- postgresql - 在 sqlalchemy orm 中定义模式名称和约束
- excel - 引用另一个工作表的 VBA 自定义函数在编辑器中正确运行,但从工作表调用时不会执行
- angular - 重新加载时或当我们从另一个页面返回时,角度材料分页会停留在当前页面上