1 编译ffmpeg4.3
1.1 ffmpeg 4.3下载
从国外git仓库下载ffmeg4.3源码速度比较慢,推荐使用国内gitee镜像下载。
git clone https://gitee.com/mirrors/ffmpeg.git -b release/4.3
1.2 编译代码
./configure --enable-shared --prefix=/home/zhy/code/mypc/ffmpeg4.3/ffmpeg/install_lib
make
make install
1.3 环境变量配置
编译后会生成ffmpeg、ffprobe等可执行文件,执行ffmeg查看是否编译成功:
./ffmpeg -version
执行命令后会报so找不到的错误:
ffmpeg: error while loading shared libraries: libavdevice.so.58: cannot open shared object file: No such file or directory
原因未进行环境变量配置,找不到so链接路径,需要执行以下操作:
sudo vim /etc/ld.so.conf
在conf中添加prefix中指定的lib install 路径,添加后入下:
include /etc/ld.so.conf.d/*.conf
/home/zhy/code/mypc/ffmpeg4.3/ffmpeg/install_lib/lib
最后更新一下配置:
sudo ldconfig
再执行./ffmpeg -version命令就可正常了。
zhy@zhy-ThinkPad-E480:~/code/mypc/ffmpeg4.3/ffmpeg$ ./ffmpeg -version
ffmpeg version n4.3.2-168-g3aba8b176f Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
configuration: --enable-shared --prefix=/home/zhy/code/mypc/ffmpeg4.3/ffmpeg/install_lib
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
zhy@zhy-ThinkPad-E480:~/code/mypc/ffmpeg4.3/ffmpeg$
2 添加自定义demuxer
ffmpeg中一个dumuxer需要包含read_header、read_packet等基本函数,如mpegts demuxer如下所示:
AVInputFormat ff_mpegtsraw_demuxer = {
.name = "mpegtsraw",
.long_name = NULL_IF_CONFIG_SMALL("raw MPEG-TS (MPEG-2 Transport Stream)"),
.priv_data_size = sizeof(MpegTSContext),
.read_header = mpegts_read_header,
.read_packet = mpegts_raw_read_packet,
.read_close = mpegts_read_close,
.read_timestamp = mpegts_get_dts,
.flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
.priv_class = &mpegtsraw_class,
};
一般来说audio和video的demuxer比较复杂,所以选择添加一个image的demuxer,image的格式选择了webp,webp 格式的spec见参考文章。
2.1 添加demuxer 定义
在libavformat\rawdec.h中添加ff_webp_demuxer定义:
#define FF_DEF_RAWIMAGE_DEMUXER(shortname, longname, probe, ext, id, flag)\
FF_RAW_DEMUXER_CLASS(shortname)\
AVInputFormat ff_ ## shortname ## _demuxer = {\
.name = #shortname,\
.long_name = NULL_IF_CONFIG_SMALL(longname),\
.read_probe = probe,\
.read_header = ff_raw_image_read_header,\
.read_packet = ff_raw_image_read_packet,\
.extensions = ext,\
.flags = flag,\
.raw_codec_id = id,\
.priv_data_size = sizeof(FFRawVideoDemuxerContext),\
.priv_class = &shortname ## _demuxer_class,\
};
2.2 添加demuxer 定义
在libavformat\rawdec.c中添加实现相关函数ff_raw_image_read_header、ff_raw_image_read_packet函数以及webp 的probe函数。
probe函数主要是用来推测container的fmt,webp格式的图片主要通过"RIFF"和”WEBP“两个推测,probe函数如下所示:
static int webp_probe(const AVProbeData *p)
{
uint8_t *b = p->buf;
printf("[debug] webp_probe\n");
if (AV_RB32(b) == MKBETAG('R', 'I', 'F', 'F')
&& AV_RB32(b + 8) == MKBETAG('W', 'E', 'B', 'P'))
{
printf("[debug] is webp image \n");
return AVPROBE_SCORE_MAX - 1;
}
return 0;
}
ff_raw_image_read_packet函数不需要特别处理,每次读取一定size的buffer就可以了。
int ff_raw_image_read_packet(AVFormatContext *s, AVPacket *pkt)
{
int ret, size = 1024;
ret = av_get_packet(s->pb, pkt, size);
if (ret < 0) {
return ret;
}
pkt->size = ret;
pkt->stream_index = 0;
pkt->flags = AV_PKT_FLAG_KEY;
return ret;
}
read_header函数中一般读取图片的width、height以及一些flag信息,ff_raw_image_read_header函数实现如下:
int ff_raw_image_read_header(AVFormatContext *s)
{
AVStream *st;
FFRawVideoDemuxerContext *s1 = s->priv_data;
int ret = 0;
printf

本文介绍了如何从头开始编译ffmpeg 4.3,并添加自定义webp demuxer。步骤包括下载源码、配置编译选项、环境变量设置,以及如何在ffmpeg中实现和替换原有webp demuxer。通过实践,确保了webp图片文件的正确解析。
699

被折叠的 条评论
为什么被折叠?



