rv1126硬编解码测试

rv1126硬编解码测试 易木雨 2024-02-27 17:03:43 321

libavcodec 是 FFmpeg 中的一个重要组件,它是一个用于音视频编解码的库。libavcodec 提供了各种音视频编解码器和相关功能的实现,使得开发者可以对音视频数据进行编解码、格式转换、滤镜处理等操作。

在 FFmpeg 的源代码中,libavcodec 位于 libavcodec 文件夹下,其中包含了多个源代码文件和头文件。libavcodec 库广泛支持各种常见的音视频编码格式和容器格式,例如 H.264、H.265、AAC、MP3、AVI、MP4 等。开发者可以使用 libavcodec 提供的函数和结构体来实现音视频编解码的功能。

libavcodec 的主要功能包括:
1、编码器(Encoder)和解码器(Decoder):libavcodec 提供了各种音视频编解码器,包括视频编码器(如 H.264)和音频编码器(如 AAC),可以将原始的音视频数据编码成特定格式,或将已经编码的音视频数据解码为原始数据。

2、格式转换:libavcodec 支持音视频数据的格式转换,可以将一个编码格式的音视频数据转换为另一个编码格式,或者将编码后的音视频数据转换为未编码的原始数据。

3、滤镜处理:libavcodec 提供了一套强大的滤镜框架,可以对音视频数据进行各种处理操作,例如加噪声、去噪声、调整亮度、对比度等。

4、伸缩和重采样:libavcodec 可以对音频数据进行伸缩和重采样的操作,以适应不同采样率、声道数等需求。

5、字幕处理:libavcodec 还支持对视频中的字幕进行解析和渲染。

总之,libavcodec 是 FFmpeg 中用于音视频编解码的核心库,通过它可以实现对音视频数据的编解码、格式转换、滤镜处理等功能。它在众多的多媒体应用和工具中得到广泛应用,为开发者提供了强大的音视频处理能力。

ffmpeg添加自定义硬件编解码器

ffmpeg命令查看支持的编解码器

ffmpeg4.1.3版本 — 从rockchip sdk里查找到的。

  • 使用ffmpeg查看rv1126的解码器
[root@Laser:/]# ffmpeg -decoders | grep "rkmpp"
V..... h264_rkmpp           h264 (rkmpp) (codec h264)
V..... hevc_rkmpp           hevc (rkmpp) (codec hevc)
V..... vp8_rkmpp           vp8 (rkmpp) (codec vp8)
V..... vp9_rkmpp           vp9 (rkmpp) (codec vp9)

由打印信息知:rv1126的ffmpeg解码器支持 h264 , h265 , vp8, vp9。

若想使用硬解码器,则avcodec_find_decoder_by_name传递的参数就是 h264_rkmpp、hevc_rkmpp、vp8_rkmpp、vp9_rkmpp 。

  • 使用ffmpeg查看rv1126的编码器
[root@Laser:/]# ffmpeg -encoders | grep "rkmpp"
V..... h264_rkmpp           h264 (rkmpp) (codec h264)

由打印信息知:rv1126的ffmpeg解码器支持 h264编码。

在代码上查看支持的硬编解码

目录是 ffmpeg-4.1.3\libavcodec\

  • rkmppdec.c 解码器
#define RKMPP_DEC(NAME, ID, BSFS) \
   RKMPP_DEC_CLASS(NAME) \
   const AVCodec ff_##NAME##_rkmpp_decoder = { \
       .name           = #NAME "_rkmpp", \    //这个参数很重要,avcodec_find_decoder_by_name依据的就是这个参数。
      .long_name      = NULL_IF_CONFIG_SMALL(#NAME " (rkmpp)"), \
      .type           = AVMEDIA_TYPE_VIDEO, \
      .id             = ID, \
      .priv_data_size = sizeof(RKMPPDecodeContext), \
      .init           = rkmpp_init_decoder, \
      .close          = rkmpp_close_decoder, \
      .receive_frame  = rkmpp_receive_frame, \
      .flush          = rkmpp_flush, \
      .priv_class     = &rkmpp_##NAME##_dec_class, \
      .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HARDWARE, \
      .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_DRM_PRIME, \
                                                        AV_PIX_FMT_NONE}, \
      .hw_configs     = rkmpp_hw_configs, \
      .bsfs           = BSFS, \
      .wrapper_name   = "rkmpp", \
  };

RKMPP_DEC(h264,  AV_CODEC_ID_H264,          "h264_mp4toannexb")
RKMPP_DEC(hevc,  AV_CODEC_ID_HEVC,          "hevc_mp4toannexb")
RKMPP_DEC(vp8,   AV_CODEC_ID_VP8,           NULL)
RKMPP_DEC(vp9,   AV_CODEC_ID_VP9,           NULL)
  • rkmppenc.c 编码器
#define RKMPP_ENC_CLASS(NAME) \
   static const AVClass rkmpp_##NAME##_enc_class = { \
       .class_name = "rkmpp_" #NAME "_enc", \
       .version   = LIBAVUTIL_VERSION_INT, \
   };

// TODO: .send_frame .receive_packet
#define RKMPP_ENC(NAME, ID, BSFS) \
   RKMPP_ENC_CLASS(NAME) \
   AVCodec ff_##NAME##_rkmpp_encoder = { \
       .name           = #NAME "_rkmpp", \
       .long_name     = NULL_IF_CONFIG_SMALL(#NAME " (rkmpp)"), \
       .type           = AVMEDIA_TYPE_VIDEO, \
       .id             = ID, \
       .init           = rkmpp_init_encoder, \
       .close         = rkmpp_close_encoder, \
       .encode2       = rkmpp_encode_frame, \
       .priv_data_size = sizeof(RKMPPEncodeContext), \
       .priv_class     = &rkmpp_##NAME##_enc_class, \
       .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE, \
       .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, \
       .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_DRM_PRIME, \
                                                        AV_PIX_FMT_NONE }, \
       .hw_configs     = rkmpp_hw_configs, \
       .bsfs           = BSFS, \
       .wrapper_name   = "rkmpp", \
   };

RKMPP_ENC(h264, AV_CODEC_ID_H264, NULL)

rv1126下命令测试硬解码

如何查看支持的转码格式?

# 查看rockchip支持的编码
ffmpeg -hide_banner -encoders | grep rkmpp
V..... h264_rkmpp           h264 (rkmpp) (codec h264)

第二列代表的是编码器的名字,为h264_rkmpp


# 查看rockchip支持的解码
ffmpeg -hide_banner -decoders | grep rkmpp
V..... h264_rkmpp           h264 (rkmpp) (codec h264)
V..... hevc_rkmpp           hevc (rkmpp) (codec hevc)
V..... vp8_rkmpp           vp8 (rkmpp) (codec vp8)
V..... vp9_rkmpp           vp9 (rkmpp) (codec vp9)

第二列代表的是解码器的名字

下面是硬解,占用cpu 100% ffmpeg -i surfing.mp4 -vcodec libx264 -f mp4 -y surfing-h264.mp4 Stream mapping: Stream #0:0 -> #0:0 (hevc (hevc_rkmpp) -> h264 (libx264)) # 这里看到解码是硬解使用hevc_rkmpp ,但编码用的是软编码libx264

下面是硬解,占用cpu 30% ffmpeg -i surfing.mp4 -vcodec mjpeg -f mp4 -y surfing-mjpeg-2.mp4 Stream mapping: Stream #0:0 -> #0:0 (hevc (hevc_rkmpp) -> mjpeg (native))# 这里看到解码是硬解使用hevc_rkmpp ,但编码用的是软编码mjpeg

下面是硬解,占用cpu 30% ffmpeg -i surfing-h264.mp4 -vcodec mjpeg -f mp4 -y surfing-mjpeg.mp4 Stream mapping: Stream #0:0 -> #0:0 (h264 (h264_rkmpp) -> mjpeg (native)) # 这里看到解码是使用h264_rkmpp

如何使用硬解码器?

  • avcodec_find_decoder_by_name (建议使用)

avcodec_find_decoder_by_name 是 FFmpeg 中的一个函数,用于根据编解码器名称查找对应的解码器。该函数的功能是在 FFmpeg 的 libavcodec 库中搜索符合指定编解码器名称的解码器,并返回一个指向 AVCodec 结构体的指针。

函数原型如下:

AVCodec *avcodec_find_decoder_by_name(const char *name);

参数 name 是要查找的编解码器名称。例如,如果你想查找 H.264 视频解码器,可以传入 “h264” 作为参数。

函数返回值是一个 AVCodec 结构体指针,它包含了找到的解码器的相关信息,例如解码器的名称、类型、支持的输入格式等。如果找到了符合名称要求的解码器,则返回指向该解码器的指针;如果未找到,则返回 NULL。

使用 avcodec_find_decoder_by_name 函数可以方便地根据名称获取所需的解码器,以便进行音视频的解码操作。

  • avcodec_find_decoder (不建议用这个,这个一般找到的是软解码器。)

avcodec_find_decoder 函数可以用于查找软解码器和硬解码器。该函数会在 FFmpeg 的 libavcodec 库中搜索符合指定编码器标识符的解码器,无论是软解码器还是硬解码器。

当调用 avcodec_find_decoder 函数时,它会按照注册解码器列表中的顺序进行搜索,并返回找到的第一个匹配的解码器。解码器可以是软解码器,也可以是依赖于特定硬件加速的硬解码器。

因此,avcodec_find_decoder 函数的返回值并不能确定是使用软解码器还是硬解码器。要确切使用软解码器或硬解码器,需要根据具体的解码器信息进行进一步配置和操作。可通过解码器的属性、硬件环境和设置等来判断是否使用了软解码器或硬解码器。

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
易木雨
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区