ffmpeg 4.3添加自定义demuxer

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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值