当前位置:网站首页>mips uclibc 交叉编译ffmpeg,支持 G711A 编解码
mips uclibc 交叉编译ffmpeg,支持 G711A 编解码
2022-07-07 03:30:00 【xhoufei2010】
1 说明
使用 ffmpeg 源码,进行交叉编译,支持 H264 和 G711A 编码支持
2 环境说明
硬件环境: mips 架构芯片
软件环境: Linux 任意版本
3 原理
(1)下载 ffmpeg 源码,从官网下载
(2) 修改源码,增加对 G711A (PCM_ALAW)支持
(3)使用交叉编译,对 ffmpeg 裁剪,最终控制在2M 以内
4 操作步骤
4.1 下载 ffmpeg 源码
从 ffmpeg 官网下载源码包,网址如下:
https://ffmpeg.org/download.html#releases
本人使用的是 ffmpeg-4.4.2 版本
https://ffmpeg.org/releases/ffmpeg-4.4.2.tar.xz
4.2 修改源码,增加uclibc 的支持,解决sys/auxv.h: No such file or directory
如果直接编译,会提示错误
libavutil/mips/cpu.c:26:22: fatal error: sys/auxv.h: No such file or directory
修改请参考如下补丁:
diff --git a/libavutil/mips/cpu.c b/libavutil/mips/cpu.c
index 59619d54de..c5da77b22b 100644
--- a/libavutil/mips/cpu.c
+++ b/libavutil/mips/cpu.c
@@ -19,7 +19,8 @@
#include "libavutil/cpu.h"
#include "libavutil/cpu_internal.h"
#include "config.h"
-#if defined __linux__ || defined __ANDROID__
+#include <features.h>
+#if (defined __linux__ || defined __ANDROID__) && !defined(__UCLIBC__)
#include <stdint.h>
#include <stdio.h>
#include <string.h>
@@ -28,7 +29,7 @@
#include "libavutil/avstring.h"
#endif
-#if defined __linux__ || defined __ANDROID__
+#if (defined __linux__ || defined __ANDROID__) && !defined(__UCLIBC__)
#define HWCAP_LOONGSON_CPUCFG (1 << 14)
@@ -105,7 +106,7 @@ static int cpu_flags_cpuinfo(void)
int ff_get_cpu_flags_mips(void)
{
-#if defined __linux__ || defined __ANDROID__
+#if (defined __linux__ || defined __ANDROID__) && !defined(__UCLIBC__)
if (cpucfg_available())
return cpu_flags_cpucfg();
else
4.3 增加 G711A 格式支持
修改 ffmpeg-4.4.2/libavformat/movenc.c 文件,参考如下补丁包修改即可,也可以直接打补丁
本补丁包针对于 ffmpeg-4.4.2 版本,其他版本请参考代码修改调整代码的位置
--- ffmpeg-4.4.2/libavformat/movenc.c 2022-04-15 04:13:38.000000000 +0800
+++ ffmpeg-4.4.2_new/libavformat/movenc.c 2022-05-18 02:28:02.335515063 +0800
@@ -1190,12 +1190,18 @@ static int mov_write_audio_tag(AVFormatC
track->par->codec_id == AV_CODEC_ID_ALAC ||
track->par->codec_id == AV_CODEC_ID_OPUS) {
avio_wb16(pb, track->par->channels);
+ } else if (track->par->codec_id == AV_CODEC_ID_PCM_ALAW) {
+ avio_wb16(pb, track->par->channels > 0 ?
+ track->par->channels : 1);
} else {
avio_wb16(pb, 2);
}
if (track->par->codec_id == AV_CODEC_ID_FLAC ||
track->par->codec_id == AV_CODEC_ID_ALAC) {
avio_wb16(pb, track->par->bits_per_raw_sample);
+ } else if (track->par->codec_id == AV_CODEC_ID_PCM_ALAW) {
+ avio_wb16(pb, track->par->bits_per_coded_sample > 0 ?
+ track->par->bits_per_coded_sample : 16);
} else {
avio_wb16(pb, 16);
}
@@ -7208,6 +7214,7 @@ static const AVCodecTag codec_mp4_tags[]
{
AV_CODEC_ID_VP9, MKTAG('v', 'p', '0', '9') },
{
AV_CODEC_ID_AV1, MKTAG('a', 'v', '0', '1') },
{
AV_CODEC_ID_AAC, MKTAG('m', 'p', '4', 'a') },
+ {
AV_CODEC_ID_PCM_ALAW, MKTAG('a', 'l', 'a', 'w') },
{
AV_CODEC_ID_ALAC, MKTAG('a', 'l', 'a', 'c') },
{
AV_CODEC_ID_MP4ALS, MKTAG('m', 'p', '4', 'a') },
{
AV_CODEC_ID_MP3, MKTAG('m', 'p', '4', 'a') },
4.4 交叉编译,并进行裁剪
./configure \
--prefix=$(pwd)/output \
--enable-cross-compile --arch=mips --target-os=linux \
--cross-prefix=mips-linux-uclibc-gnu- --cc=mips-linux-uclibc-gnu-gcc-5.4.0 \
--disable-everything \
--disable-mipsfpu --disable-yasm \
--disable-autodetect \
--disable-avdevice \
--disable-avfilter \
--disable-msa \
--disable-debug \
--disable-protocols --enable-protocol=file \
--disable-demuxers --enable-demuxer=mov \
--disable-muxers --enable-muxer=mp4 --enable-muxer=mov \
--disable-decoders --enable-decoder=pcm_alaw --enable-decoder=h264 --enable-decoder=mpeg4 \
--disable-encoders --enable-encoder=pcm_s16le \
--disable-bsfs --enable-bsf=h264_mp4toannexb \
--disable-static --enable-shared \
--enable-small
说明:
–prefix=$(pwd)/output 设置安装目录
–enable-cross-compile --arch=mips --target-os=linux 配置为 mips 架构
–cross-prefix=mips-linux-uclibc-gnu- --cc=mips-linux-uclibc-gnu-gcc-5.4.0 交叉编译工具链和GCC编译器设置
–disable-everything 关闭多余的项目,减少编译库大小,这个根据个人情况而定
–disable-mipsfpu --disable-yasm 关闭mipsfpu ,不关闭编译报错
–disable-autodetect 关闭 autodetect ,减小库提及
–disable-avdevice 关闭 avdevice,嵌入式设备不需要
–disable-avfilter 关闭 avfilter,项目不需要
–disable-msa 关闭 msa ,项目不需要
–disable-debug \ 关闭 debug ,减小体积
–disable-protocols --enable-protocol=file 协议仅仅支持文件协议,可以支持文件的封装和解封装
–disable-demuxers --enable-demuxer=mov 支持对 mov 格式文件的分离,本人项目使用MP4格式,demuxers 没有 MP4 选项,但是 Mov 格式兼容 mp4
–disable-muxers --enable-muxer=mp4 --enable-muxer=mov
支持mp4文件合并,用于打包 Mp4文件
–disable-decoders --enable-decoder=pcm_alaw --enable-decoder=h264 --enable-decoder=mpeg4
解码器只开启 pcm_alaw (g711a) h264 mpeg4 这3种格式
–disable-encoders --enable-encoder=pcm_s16le
编码器只开启 pcm_s16le 格式,因为本人项目需要对音频重采样为 PCM 16K,所以需要使用编码器
–disable-bsfs --enable-bsf=h264_mp4toannexb
bsfs 开启 h264,用于h264文件解码,必选
–disable-static --enable-shared
使能动态库编译方式
–enable-small
让文件编译更小
编译文件库大小最终裁剪之后,如图4-2所示:
5 视频格式介绍:
合成文件: h264+g711a --> mp4 ,其中 h264和g711a采用mips 芯片自带的硬件编码器,所以ffmeg 没有编译对应的编码器
解码: mp4—> h264 + pcm,将 h264 和 pcm 解码
不同项目采用的编码格式不一样,需要修改为自己适合的配置参数,如果不清楚配置参数,可以使用
./configure --help
查看
如果需要 pcm 转为 g711a, 可参考其他博客,进行转码
https://blog.csdn.net/jenie/article/details/106298846
边栏推荐
- 关于二进制无法精确表示小数
- MySQL view bin log and recover data
- Stack Title: nesting depth of valid parentheses
- linux系统rpm方式安装的mysql启动失败
- SolidWorks GB Library (steel profile library, including aluminum profile, aluminum tube and other structures) installation and use tutorial (generating aluminum profile as an example)
- How to model and simulate the target robot [mathematical / control significance]
- Graduation design game mall
- $parent(获取父组件) 和 $root(获取根组件)
- 选择商品属性弹框从底部弹出动画效果
- Matlab tips (29) polynomial fitting plotfit
猜你喜欢
Jetpack compose is much more than a UI framework~
CompletableFuture使用详解
How can clothing stores make profits?
.net core 访问不常见的静态文件类型(MIME 类型)
Data of all class a scenic spots in China in 2022 (13604)
After the promotion, sales volume and flow are both. Is it really easy to relax?
Basic introduction of JWT
Bus消息总线
SQLMAP使用教程(四)实战技巧三之绕过防火墙
弹性布局(一)
随机推荐
数据资产管理与数据安全国内外最新趋势
选择商品属性弹框从底部弹出动画效果
工具类:对象转map 驼峰转下划线 下划线转驼峰
Exception of DB2 getting table information: caused by: com ibm. db2.jcc. am. SqlException: [jcc][t4][1065][12306][4.25.13]
[explanation of JDBC and internal classes]
关于数据库数据转移的问题,求各位解答下
oracle如何备份索引
Stack Title: nesting depth of valid parentheses
FPGA course: application scenario of jesd204b (dry goods sharing)
Composition API 前提
Sword finger offer high quality code
Precise space-time travel flow regulation system - ultra-high precision positioning system based on UWB
7天零基础能考证HCIA吗?华为认证系统学习路线分享
子组件传递给父组件
Algorithm --- bit count (kotlin)
OOM(内存溢出)造成原因及解决方案
2018年江苏省职业院校技能大赛高职组“信息安全管理与评估”赛项任务书
Complete process of MySQL SQL
组件的嵌套和拆分
How DHCP router works