RK3568使用C++和FFmpeg进行视频流,并使用自带GPU加速

embedded/2025/2/10 7:47:27/

RK3568平台上使用C++和FFmpeg进行视频流处理时,可以利用GPU加速解码。RK3568芯片集成了Mali-G52 GPU,支持硬件加速的视频解码。以下是一个基本的示例,展示如何使用FFmpeg和RK3568的GPU加速来拉取视频流。

1. 安装FFmpeg和RKMPP

首先,确保你已经安装了FFmpeg和RKMPP(Rockchip Media Process Platform)。RKMPP是Rockchip提供的用于硬件加速的库。

sudo apt-get update
sudo apt-get install ffmpeg
sudo apt-get install librkmpp-dev

2. 编写C++代码

以下是一个简单的C++代码示例,展示如何使用FFmpeg和RKMPP来拉取视频流并进行硬件加速解码。

extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/hwcontext.h>
#include <libavutil/error.h>
#include <libavutil/imgutils.h>
#include <libavutil/opt.h>
#include <libswscale/swscale.h>
}#include <iostream>
#include <stdexcept>#define HARDWARE_DEVICE_TYPE AV_HWDEVICE_TYPE_DRMvoid handle_error(int errnum) {char errbuf[AV_ERROR_MAX_STRING_SIZE];av_strerror(errnum, errbuf, sizeof(errbuf));throw std::runtime_error(errbuf);
}int main(int argc, char* argv[]) {if (argc < 2) {std::cerr << "Usage: " << argv[0] << " <input_url>" << std::endl;return 1;}const char* input_url = argv[1];av_register_all();avformat_network_init();AVFormatContext* format_ctx = avformat_alloc_context();if (!format_ctx) {std::cerr << "Could not allocate format context" << std::endl;return 1;}if (avformat_open_input(&format_ctx, input_url, nullptr, nullptr) < 0) {std::cerr << "Could not open input " << input_url << std::endl;return 1;}if (avformat_find_stream_info(format_ctx, nullptr) < 0) {std::cerr << "Could not find stream information" << std::endl;return 1;}int video_stream_index = -1;for (unsigned int i = 0; i < format_ctx->nb_streams; i++) {if (format_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {video_stream_index = i;break;}}if (video_stream_index == -1) {std::cerr << "Could not find video stream" << std::endl;return 1;}AVCodecParameters* codec_params = format_ctx->streams[video_stream_index]->codecpar;const AVCodec* codec = avcodec_find_decoder(codec_params->codec_id);if (!codec) {std::cerr << "Unsupported codec" << std::endl;return 1;}AVCodecContext* codec_ctx = avcodec_alloc_context3(codec);if (!codec_ctx) {std::cerr << "Could not allocate codec context" << std::endl;return 1;}if (avcodec_parameters_to_context(codec_ctx, codec_params) < 0) {std::cerr << "Could not copy codec parameters to context" << std::endl;return 1;}AVBufferRef* hw_device_ctx = nullptr;if (av_hwdevice_ctx_create(&hw_device_ctx, HARDWARE_DEVICE_TYPE, nullptr, nullptr, 0) < 0) {std::cerr << "Could not create hardware device context" << std::endl;return 1;}codec_ctx->hw_device_ctx = av_buffer_ref(hw_device_ctx);if (avcodec_open2(codec_ctx, codec, nullptr) < 0) {std::cerr << "Could not open codec" << std::endl;return 1;}AVFrame* frame = av_frame_alloc();AVFrame* sw_frame = av_frame_alloc();if (!frame || !sw_frame) {std::cerr << "Could not allocate frames" << std::endl;return 1;}AVPacket packet;while (av_read_frame(format_ctx, &packet) >= 0) {if (packet.stream_index == video_stream_index) {if (avcodec_send_packet(codec_ctx, &packet) < 0) {std::cerr << "Error sending packet for decoding" << std::endl;break;}while (avcodec_receive_frame(codec_ctx, frame) >= 0) {if (frame->format == AV_PIX_FMT_DRM_PRIME) {if (av_hwframe_transfer_data(sw_frame, frame, 0) < 0) {std::cerr << "Error transferring data to software frame" << std::endl;break;}// Process sw_frame herestd::cout << "Frame decoded: " << sw_frame->width << "x" << sw_frame->height << std::endl;}}}av_packet_unref(&packet);}av_frame_free(&frame);av_frame_free(&sw_frame);avcodec_free_context(&codec_ctx);avformat_close_input(&format_ctx);av_buffer_unref(&hw_device_ctx);return 0;
}

3. 编译代码

此处代码仅作参考,建议使用cmake搭建工程后编译测试


http://www.ppmy.cn/embedded/161027.html

相关文章

mac 安装 dotnet 环境

目录 一、安装准备 二、安装方法&#xff08;两种任选&#xff09; 方法 1&#xff1a;使用官方安装包&#xff08;推荐新手&#xff09; 方法 2&#xff1a;使用 Homebrew&#xff08;适合开发者&#xff09; 1. 安装 Homebrew&#xff08;如未安装&#xff09; 2. 通过 …

鸿蒙harmony 手势密码

1.效果图 2.设置手势页面代码 /*** 手势密码设置页面*/ Entry Component struct SettingGesturePage {/*** PatternLock组件控制器*/private patternLockController: PatternLockController new PatternLockController()/*** 用来保存提示文本信息*/State message: string …

使用deepseek快速创作ppt

目录 1.在DeekSeek生成PPT脚本2.打开Kimi3.最终效果 DeepSeek作为目前最强大模型&#xff0c;其推理能力炸裂&#xff0c;但是DeepSeek官方没有提供生成PPT功能&#xff0c;如果让DeepSeek做PPT呢&#xff1f; 有个途径&#xff1a;在DeepSeek让其深度思考做出PPT脚本&#xf…

【力扣】138.随机链表的复制

AC截图 题目 代码 使用哈希存储<旧节点&#xff0c;新结点> /* // Definition for a Node. class Node { public:int val;Node* next;Node* random;Node(int _val) {val _val;next NULL;random NULL;} }; */class Solution { public:Node* copyRandomList(Node* hea…

DeepSeek-R1技术报告快速解读

相关论文链接如下&#xff1a; DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language ModelsDeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning 文章目录 一、论文脑图二、论文解读2.1 研究背景2.2 研究方法2.3 …

Java基础知识(七) -- 集合

1.概述 集合是 Java 中提供的一种容器&#xff0c;可以用来存储多个数据。集合主要分为两大系列&#xff1a;Collection和Map&#xff0c;Collection 表示一组对象&#xff0c;Map表示一组映射关系或键值对。集合和数组既然都是容器&#xff0c;它们有啥区别呢&#xff1f; 数…

Nginx 日志切割:按日期管理日志文件,提升运维效率

&#x1f3e1;作者主页&#xff1a;点击&#xff01; Nginx-从零开始的服务器之旅专栏&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年2月9日11点20分 在日常运维中&#xff0c;Nginx…

idea菜单栏、工具栏、前进后退按钮不显示问题

idea菜单栏、工具栏、前进后退按钮不显示问题 菜单/导航栏不显示 打开 Settings&#xff08;设置&#xff09;&#xff0c;进入 Appearance & Behavior > Appearance > UI Options&#xff0c;勾选 Show main menu in a separate tool bar&#xff08;在单独的工具…