rv1126硬编解码测试
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 函数的返回值并不能确定是使用软解码器还是硬解码器。要确切使用软解码器或硬解码器,需要根据具体的解码器信息进行进一步配置和操作。可通过解码器的属性、硬件环境和设置等来判断是否使用了软解码器或硬解码器。
- 分享
- 举报
-
bob 2024-07-19 09:51:01回复 举报你好。能提供一下文中的4.1.3的ffmpeg的下载链接吗
-
浏览量:2288次2023-11-17 09:00:06
-
浏览量:1542次2023-10-24 18:27:46
-
浏览量:4566次2021-04-27 16:33:22
-
浏览量:944次2023-08-30 18:37:06
-
浏览量:3820次2021-04-01 13:54:47
-
浏览量:2043次2023-04-07 17:30:05
-
浏览量:3515次2023-04-19 17:17:55
-
浏览量:3955次2021-04-02 09:47:41
-
浏览量:1128次2024-01-26 15:15:36
-
浏览量:1591次2023-12-29 17:51:55
-
浏览量:724次2024-01-02 09:46:50
-
浏览量:3942次2021-06-18 16:05:42
-
浏览量:3458次2022-09-03 09:03:36
-
浏览量:1176次2023-12-07 00:53:19
-
浏览量:2454次2023-11-29 08:59:50
-
浏览量:1236次2023-08-31 16:23:55
-
浏览量:2949次2021-06-12 17:32:52
-
浏览量:957次2023-11-10 15:08:11
-
浏览量:598次2023-11-28 14:16:24
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
易木雨
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明