交叉編譯源碼的方式移植ffmpeg-rockchip

獲取ffmpeg源碼

git submodule add -f https://github.com/FFmpeg/FFmpeg.git thirdparty/FFmpeg

瑞芯微ffmpeg-rk

git clone https://github.com/jjm2473/ffmpeg-rk/tree/enc#

?參考的一位博主的說法

使用 ffmpeg-rochip 的好處

傳統的使用硬件編解碼的開發思路是:使用 ffmpeg 獲取視頻流,然后用 MPP 庫進行硬件編解碼,最后再傳給 ffmpeg 進行復用,生成容器文件或推流。這樣做的缺點是整個開發成本較高,需要學習 ffmpeg,還要學習 MPP庫。

而現在有了 ffmpeg-rochip 之后,我們可以省略去學習使用 MPP 庫的步驟,因為這個庫已經幫我們封裝好了 MPP 的功能,我們只需要像之前那樣使用 ffmpeg 即可,只需在使用編解碼器時換成 xxx_rkmpp,比如 h264_rkmpp。這樣做的好處就是大大降低我們的開發學習成本。

ffmpeg-rockchip源碼編譯流程

首先git clone,設置好交叉編譯環境寫PKG環境變量,這一點很重要

export PKG_CONFIG_SYSROOT_DIR=/home/zhangyu/RK3588/rk3588-buildroot-2021.11-sdk-v1.0/buildroot/output/rockchip_rk3588/host/aarch64-buildroot-linux-gnu/sysroot
export RKMPP_PC_PATH=/home/zhangyu/RK3588/rk3588-buildroot-2021.11-sdk-v1.0/buildroot/output/rockchip_rk3588/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/pkgconfig
export PKG_CONFIG_LIBDIR=${RKMPP_PC_PATH}:${PKG_CONFIG_SYSROOT_DIR}/usr/lib/pkgconfig:${PKG_CONFIG_SYSROOT_DIR}/usr/share/pkgconfigexport PKG_CONFIG_LIBDIR=${RKMPP_PC_PATH}:${PKG_CONFIG_SYSROOT_DIR}/usr/lib/:${PKG_CONFIG_SYSROOT_DIR}/usr/share/pkgconfig
export LD_LIBRARY_PATH="/home/zhangyu/RK3588/rk3588-buildroot-2021.11-sdk-v1.0/buildroot/output/rockchip_rk3588/host/lib:$LD_LIBRARY_PATH"

文件路徑根據自己的buildroot文件更改,目的是讓pkg-config能找到對應的包,

pkg-config libdrm -exists
pkg-config rk_mpp -exists    

echo $

輸出為0,則說明能找到

進入ffmpeg-rockchip根目錄下,

./configure --enable-version3 \--enable-nonfree \--enable-gpl \--sysroot=$HOME/RK3588/rk3588-buildroot-2021.11-sdk-v1.0/buildroot/output/rockchip_rk3588/host/aarch64-buildroot-linux-gnu/sysroot \--prefix=/home/zhangyu/ffmpeg-rk-test/build\--target-os=linux \--arch=aarch64 \--cc=aarch64-buildroot-linux-gnu-gcc \--enable-cross-compile \--disable-x86asm \--enable-shared \--disable-static\--enable-libdrm \--enable-rkmpp\--enable-rkrga\--disable-doc\--disable-debug\--disable-hardcoded-tables\--disable-mipsdsp\--disable-mipsfpu\--disable-hardcoded-tables \--disable-stripping\--extra-cflags="-fno-builtin-lrintf -fno-builtin-lrint" \--extra-ldflags="-lm"\--enable-protocols\--enable-network
make
make install

根據情況做出更改

ffmpeg rtsp流推流驗證,

#include <cstdint>
#include <string>
#include <vector>
#include <iostream>
#include <thread>
#include <chrono>extern "C" {#include <libavcodec/avcodec.h>#include <libavformat/avformat.h>#include <libavutil/imgutils.h>#include <libavutil/time.h>
}struct Frame {
void* data;
size_t size;
int width;
int height;
int pitch;
std::string cameraId;
std::string cameraName;
uint64_t timestamp;
};void log_error(int ret, const std::string& msg) {char buf[256];av_strerror(ret, buf, sizeof(buf));std::cerr << msg << " Error: " << buf << std::endl;
}int main() {av_log_set_level(AV_LOG_ERROR); // 只顯示錯誤信息,避免日志過多avformat_network_init();// 初始化白幀和黑幀(Y分量)uint8_t buffW[1920 * 1080];uint8_t buffB[1920 * 1080];memset(buffW, 255, sizeof(buffW));memset(buffB, 0, sizeof(buffB));Frame frameWhite = { .data = buffW, .size = 1920 * 1080, .width = 1920, .height = 1080, .pitch = 1920 };Frame frameBlack = { .data = buffB, .size = 1920 * 1080, .width = 1920, .height = 1080, .pitch = 1920 };Frame* doubleBuffer[2] = { &frameWhite, &frameBlack };const char* outUrl = "rtsp://10.168.1.103:8554/live/stream1";// 查找硬件編碼器(Rockchip)const AVCodec* codec = avcodec_find_encoder_by_name("h264_rkmpp");if (!codec) {std::cerr << "Encoder h264_rkmpp not found\n";return -1;}AVCodecContext* codecCtx = avcodec_alloc_context3(codec);codecCtx->width = 1920;codecCtx->height = 1080;codecCtx->pix_fmt = AV_PIX_FMT_YUV420P;codecCtx->time_base = AVRational{1, 25}; // 設置幀率為25fpscodecCtx->framerate = AVRational{25, 1};if (avcodec_open2(codecCtx, codec, nullptr) < 0) {std::cerr << "Failed to open codec\n";return -1;}// 創建輸出格式上下文(RTSP)AVFormatContext* fmtCtx = nullptr;avformat_alloc_output_context2(&fmtCtx, nullptr, "rtsp", outUrl);if (!fmtCtx) {std::cerr << "Could not allocate output context\n";return -1;}// 添加視頻流并設置其參數AVStream* videoStream = avformat_new_stream(fmtCtx, codec);videoStream->time_base = codecCtx->time_base;avcodec_parameters_from_context(videoStream->codecpar, codecCtx);// 設置RTSP推流選項AVDictionary* opts = nullptr;av_dict_set(&opts, "rtsp_transport", "tcp", 0); // 使用TCP傳輸av_dict_set(&opts, "stimeout", "5000000", 0);   // 設置超時5秒// ?? 不要調用 avio_open2 —— RTSP 使用的是 URL 打開方式,直接調用 avformat_write_header 即可。// 正確方式:建立連接并寫入頭部信息if (avformat_write_header(fmtCtx, &opts) < 0) {std::cerr << "Failed to write header to output\n";return -1;}// 創建并初始化幀AVFrame* frame = av_frame_alloc();frame->format = codecCtx->pix_fmt;frame->width = codecCtx->width;frame->height = codecCtx->height;av_frame_get_buffer(frame, 32);// 創建編碼后的數據包AVPacket* pkt = av_packet_alloc();int64_t pts = 0;int index = 0;while (true) {Frame* src = doubleBuffer[index];index = !index;// 將灰度圖像寫入Y分量memcpy(frame->data[0], src->data, 1920 * 1080);// UV分量設置為中性值(灰色)memset(frame->data[1], 128, 1920 * 1080 / 4);memset(frame->data[2], 128, 1920 * 1080 / 4);frame->pts = pts++;int ret = avcodec_send_frame(codecCtx, frame);if (ret < 0) {log_error(ret, "send_frame");continue;}while (ret >= 0) {ret = avcodec_receive_packet(codecCtx, pkt);if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) break;if (ret < 0) {log_error(ret, "receive_packet");break;}pkt->stream_index = videoStream->index;pkt->pts = av_rescale_q(pkt->pts, codecCtx->time_base, videoStream->time_base);pkt->dts = av_rescale_q(pkt->dts, codecCtx->time_base, videoStream->time_base);pkt->duration = av_rescale_q(pkt->duration, codecCtx->time_base, videoStream->time_base);av_interleaved_write_frame(fmtCtx, pkt);av_packet_unref(pkt);}std::this_thread::sleep_for(std::chrono::milliseconds(40)); // 控制幀率25fps}// 清理資源av_write_trailer(fmtCtx);avcodec_free_context(&codecCtx);avformat_free_context(fmtCtx);av_frame_free(&frame);av_packet_free(&pkt);return 0;
}

FFmpeg初始化驗證

#include <iostream>
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>
}int main() {// // 初始化 FFmpeg 網絡模塊(可選)// avformat_network_init();// 打印 FFmpeg 版本信息std::cout << "=== FFmpeg 庫測試 ===" << std::endl;std::cout << "avcodec 版本: " << avcodec_version() << std::endl;std::cout << "avformat 版本: " << avformat_version() << std::endl;std::cout << "avutil 版本: " << avutil_version() << std::endl;return 0;
}

查找編碼器

ffmpeg -encoders | grep h264

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83417.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83417.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83417.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

9.0 C# 調用solidworks介紹1

一、C# 與 SolidWorks 聯合開發概述 SolidWorks 提供了完整的 API(應用程序接口),允許開發者使用 C# 等編程語言進行二次開發,實現自動化設計、定制功能等。 主要技術要點包括: 1. API 結構:SolidWorks API 是基于 COM 的接口,包含數百個對象和數千個方法…

AD 多層線路及裝配圖PDF的輸出

裝配圖的輸出&#xff1a; 1.點開‘智能PDF’ 2. 設置顯示頂層&#xff1a; 設置顯示底層&#xff1a; 多層線路的輸出 同樣使用‘智能PDF’

SpringBoot + Shiro + JWT 實現認證與授權完整方案實現

SpringBoot Shiro JWT 實現認證與授權完整方案 下面博主將詳細介紹如何使用 SpringBoot 整合 Shiro 和 JWT 實現安全的認證授權系統&#xff0c;包含核心代碼實現和最佳實踐。 一、技術棧組成 技術組件- 作用版本要求SpringBoot基礎框架2.7.xApache Shiro認證和授權核心1.…

PCIe數據采集系統詳解

PCIe數據采集系統詳解 在上篇文章中&#xff0c;廢了老大勁兒我們寫出了PCIe數據采集系統&#xff1b;其中各個模塊各司其職&#xff0c;相互配合。完成了從數據采集到高速存儲到DDR3的全過程。今天我們呢就來詳細講解他們之間的關系&#xff1f;以及各個模塊的關鍵點&#xff…

2025云智算技術白皮書

1. 云智算的演進背景 傳統云計算面臨三大挑戰&#xff1a; 算力需求激增&#xff1a;AI大模型訓練需十萬卡級GPU集群&#xff0c;資源調度能力不足。網絡性能瓶頸&#xff1a;TB級參數同步對低時延、高吞吐要求遠超傳統網絡架構。服務形態單一&#xff1a;IaaS/PaaS無法覆蓋A…

C語言編程中的時間處理

最簡單的time 在C語言編程中&#xff0c;處理時間最簡單的函數就是time了。它的原型為&#xff1a; #include <time.h> time_t time(time_t *_Nullable tloc);返回自從EPOCH&#xff0c;即1970年1月1日的零點零時零分&#xff0c;到當前的秒數。 輸入參數可以是NULL。…

適應性神經樹:當深度學習遇上決策樹的“生長法則”

1st author: Ryutaro Tanno video: Video from London ML meetup paper: Adaptive Neural Trees ICML 2019 code: rtanno21609/AdaptiveNeuralTrees: Adaptive Neural Trees 背景 在機器學習領域&#xff0c;神經網絡&#xff08;NNs&#xff09;憑借其強大的表示學習能力&…

InitVerse節點部署教程

項目介紹: InitVerse 是一個為新興企業量身定制的自動化 Web3 SaaS 平臺,只需單擊幾下即可快速開發和部署 DApp。在 INIChain 和 INICloud 的支持下,InitVerse 可以根據需求動態調整計算資源,實現高效的任務處理,同時提供更高的安全性、可用性和可擴展性。 系統要求: C…

阿里開源通義萬相 Wan2.1-VACE,開啟視頻創作新時代

0.前言 阿里巴巴于2025年5月14日正式開源了其最新的AI視頻生成與編輯模型——通義萬相Wan2.1-VACE。這一模型是業界功能最全面的視頻生成與編輯工具&#xff0c;能夠同時支持多種視頻生成和編輯任務&#xff0c;包括文生視頻、圖像參考視頻生成、視頻重繪、局部編輯、背景延展…

解決“VMware另一個程序已鎖定文件的一部分,進程無法訪問“

問題描述 打開VMware里的虛擬機時&#xff0c;彈出"另一個程序已鎖定文件的一部分&#xff0c;進程無法訪問"如圖所示&#xff1a; 這是VM虛擬機的保護機制。虛擬機運行時&#xff0c;為防止數據被篡改&#xff0c;會將所運行的文件保護起來。當虛擬機崩潰或者強制…

基于大數據的租房信息可視化系統的設計與實現【源碼+文檔+部署】

課題名稱 基于大數據的租房信息可視化系統的設計與實現 學 院 專 業 計算機科學與技術 學生姓名 指導教師 一、課題來源及意義 租房市場一直是社會關注的熱點問題。隨著城市化進程的加速&#xff0c;大量人口涌入城市&#xff0c;導致租房需求激增。傳統的租…

Vue3封裝公共圖片組件

對圖片加載做的處理: 圖片加載狀態響應式管理圖片訪問錯誤的處理機制圖片懶加載可通過slot支持自定義加載動畫其他監聽事件的處理及向上傳遞 …<!-- components/CustomImage.vue --> <template><div class="custom-image-wrapper"><!-- 主圖 -…

車道線檢測----CLRKDNet

今天的最后一篇 車道線檢測系列結束 CLRKDNet&#xff1a;通過知識蒸餾加速車道檢測 摘要&#xff1a;道路車道是智能車輛視覺感知系統的重要組成部分&#xff0c;在安全導航中發揮著關鍵作用。在車道檢測任務中&#xff0c;平衡精度與實時性能至關重要&#xff0c;但現有方法…

Python-感知機以及實現感知機

感知機定義 如果有一個算法&#xff0c;具有1個或者多個入參&#xff0c;但是返回值要么是0&#xff0c;要么是1&#xff0c;那么這個算法就叫做感知機&#xff0c;也就是說&#xff0c;感知機是個算法 感知機有什么用 感知機是用來表示可能性的大小的&#xff0c;我們可以認…

STM32 ADC+DMA+TIM觸發采樣實戰:避坑指南與源碼解析

知識點1【TRGO的介紹】 1、TRGO的概述 TRGO&#xff1a;Trigger Output&#xff08;觸發輸出&#xff09;&#xff0c;是定時器的一種功能。 它可以作為外設的啟動信號&#xff0c;比如ADC轉換&#xff0c;DAC輸出&#xff0c;DMA請求等。 對于ADC來說&#xff0c;可以通過…

Qwen3技術報告解讀

https://github.com/QwenLM/Qwen3/blob/main/Qwen3_Technical_Report.pdf 節前放模型&#xff0c;大晚上的發技術報告。通義&#xff0c;真有你的~ 文章目錄 預訓練后訓練Long-CoT Cold StartReasoning RLThinking Mode FusionGeneral RLStrong-to-Weak Distillation 模型結構…

【網絡編程】十、詳解 UDP 協議

文章目錄 Ⅰ. 傳輸層概述1、進程之間的通信2、再談端口號端口號的引出五元組標識一個通信端口號范圍劃分常見的知名端口號查看知名端口號協議號 VS 端口號 3、兩個問題一個端口號是否可以被多個進程綁定&#xff1f;一個進程是否可以綁定多個端口號&#xff1f; 4、部分常見指令…

實現RTSP低延遲播放器,挑戰與解決方案

隨著低延遲直播需求的快速增長&#xff0c;RTSP&#xff08;Real-Time Streaming Protocol&#xff09;播放器逐漸成為實時視頻流傳輸中的核心技術之一。與WebRTC&#xff08;Web Real-Time Communication&#xff09;相比&#xff0c;RTSP在實時性和網絡延遲方面面臨諸多挑戰&…

【springcloud學習(dalston.sr1)】Eureka單個服務端的搭建(含源代碼)(三)

該系列項目整體介紹及源代碼請參照前面寫的一篇文章【springcloud學習(dalston.sr1)】項目整體介紹&#xff08;含源代碼&#xff09;&#xff08;一&#xff09; springcloud學習&#xff08;dalston.sr1&#xff09;系統文章匯總如下&#xff1a; 【springcloud學習(dalston…

GPU與NPU異構計算任務劃分算法研究:基于強化學習的Transformer負載均衡實踐

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生專屬優惠。 引言 在邊緣計算與AI推理場景中&#xff0c;GPU-NPU異構計算架構已成為突破算力瓶頸的關鍵技…