rk3399pro硬解碼(vpu蛔添,rtsp)使用

系統(tǒng)debian10痰催,攝像頭:海康;
鑒于瑞芯微官網(wǎng)論壇介紹硬解碼使用不夠詳細(xì)迎瞧,在踩了許多坑的情況下總結(jié)如下夸溶,供大家參考。

系統(tǒng)軟件包升級(jí)

  1. 更新源:sudo apt update --fix-missing
  2. 升級(jí)軟件包:sudo apt -y upgrade
    注意:升級(jí)過(guò)去中會(huì)有提示確認(rèn)是否提供/etc/apt/sources.list.d/toybrick.list,請(qǐng)輸入"Y"
  3. 再次更新源:sudo apt update

說(shuō)明:上述步驟只需要執(zhí)行一次即可凶硅,后續(xù)軟件包升級(jí)只需要執(zhí)行命令
sudo apt update; sudo apt upgrade
參考:
瑞芯微社區(qū)關(guān)于toybrick系列debian10系統(tǒng)軟件包升級(jí)說(shuō)明

一缝裁、 python方式

install toybrick-0.3.0-py3-none-any.whl 下載地址:鏈接: https://pan.baidu.com/s/1AkJ70nTTIIXbgDYbF6IPUQ 提取碼: b54n
安裝以下依賴(lài)

sudo apt-get install g++ binutils-gold xorg-dev libglu1-mesa-dev  
sudo apt install libgbm-dev  
sudo apt install rockchip-mpp  
sudo apt install toybrick-gbm-dev  
sudo toybrick-mali.sh link   

sudo pip3 install toybrick-0.3.0-py3-none-any.whl  

驗(yàn)證安裝是否成功

import toybrick as toy

python掉用代碼

import toybrick as toy
import time
import cv2

url = "rtsp://admin:123456@192.168.1.200:554/h264/ch1/main/av_stream"
username = "admin"
pwd = "123456"
#rtsp = toy.input.createRtspClient(url, username, pwd, False)
rtsp = toy.input.createRtspClient(url)
rtsp.connect()
last = time.time()
gl = toy.output.createGLDrmDisplay(toy.DisplayPort.HDMI_A)
idx0 = gl.add_view(50, 600, 768, 432)
frame_index = 0
while rtsp.is_opened():
    frame = rtsp.read_rgb(768, 432)
    now = time.time()
    gl.show(idx0, frame)
    print (frame_index, "----------------------------",now - last)
    frame = frame.array()
    cv2.imwrite("images/4_" + str(frame_index) + ".jpg", frame)
    # cv2.imshow('Carplate demo', cv2.resize(frame, (960, 540)))  #
    frame_index += 1
    last = now

運(yùn)行效果


參考:
瑞芯微社區(qū)RK3399Pro入門(mén)教程(8)6路1080P30幀解碼顯示范例

二.、C++方式

安裝依賴(lài)

sudo apt-get install curl  
sudo apt-get install libcurl4-openssl-dev  
sudo apt-get install libopencv-dev  
sudo apt install rockchip-drm-dev libdrm-dev  
sudo apt install rockchip-rtsp-dev  
sudo apt install rockchip-mpp-dev  
sudo apt install rockchip-rga-dev  

rtsp_ssd .cpp

#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <thread>
#include <memory.h>
#include <sys/time.h>
#include <queue>

using namespace std;

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"

#include <rockchip/rockchip_rtsp.h>
#include <rockchip/rockchip_mpp.h>
extern "C" {
#include <rockchip/rockchip_rga.h>
}

#define RTSP_URL    "rtsp://192.168.1.200/h264/ch1/main/av_stream"
#define RTSP_USER   "admin"
#define RTSP_PWD    "123456"

static MppDecoder *mpp_dec = NULL;
static std::queue<DecFrame *> frame_queue;
static int run_flag = 0;

unsigned long get_time(void)
{
    struct timeval ts;
    gettimeofday(&ts, NULL);
    return (ts.tv_sec * 1000 + ts.tv_usec / 1000);
}

void onRtspHandle(unsigned char *buf, size_t len)
{
    std::cout << "frame recived " << len << std::endl;

    mpp_dec->ops->enqueue(mpp_dec, buf, len);
}

void inference_thread(RockchipRga *rga, int width, int height)
{
    int ret;
    int resize_w = 1920, resize_h = 1080;
    static int frame_size = 0;
    unsigned char *frame_rgb = NULL;

    rga->ops->initCtx(rga);
    rga->ops->setRotate(rga, RGA_ROTATE_NONE);
    rga->ops->setSrcFormat(rga, V4L2_PIX_FMT_NV12, width, height);
    rga->ops->setDstFormat(rga, V4L2_PIX_FMT_BGR24, resize_w, resize_h);
    
    frame_size = resize_w * resize_h * 3;
    frame_rgb = (unsigned char *)malloc(frame_size);
    cv::Mat img(resize_h , resize_w , CV_8UC3, frame_rgb);
    if (!frame_rgb)
        goto exit;
    
    rga->ops->setDstBufferPtr(rga, frame_rgb);

    while (run_flag) {
        if (frame_queue.empty()) {
            usleep(1000);
            continue;
        }

        auto frame = frame_queue.front();

        rga->ops->setSrcBufferPtr(rga, frame->data);

        ret = rga->ops->go(rga);
        printf("inference_thread ................\n");
        if (!ret) {
            ///do something with frame_rgb

            cv::imshow("test", img);
            cv::waitKey(10);
        }

        frame_queue.pop();
        mpp_dec->ops->freeFrame(frame);
    }

exit:
    run_flag = 0;

    while (!frame_queue.empty()) {
        auto frame = frame_queue.front();
        mpp_dec->ops->freeFrame(frame);
        frame_queue.pop();
    }

    if (frame_rgb)
        free(frame_rgb);
}

void decode_thread(RockchipRga *rga)
{
    int ret;
    int first_frame = 0;
    std::thread t_inference;

    while (run_flag) {
        DecFrame *frame = mpp_dec->ops->dequeue_timeout(mpp_dec, 300);
        if (frame != NULL) {
            std::cout << "decode frame" << frame->width << "x" << frame->height << std::endl;
        
            if (!first_frame) {
                std::cout << "first_frame" << std::endl;
                t_inference = std::thread(inference_thread, rga, frame->width, frame->height);
                first_frame = 1;
            }

            if (frame_queue.size() < 30)
                frame_queue.push(frame);
            else
                mpp_dec->ops->freeFrame(frame);
        }
    }

exit:
    run_flag = 0;

    t_inference.join();

    while (!frame_queue.empty()) {
        auto frame = frame_queue.front();
        mpp_dec->ops->freeFrame(frame);
        frame_queue.pop();
    }

}

int main(int argc, char **argv)
{
    int ret;
    RockchipRga *rga;
    unsigned char ready[5] = {'r', 'e', 'a', 'd', 'y'};
    RtspClient rtsp_client(RTSP_URL, RTSP_USER, RTSP_PWD);

    rtsp_client.setDataCallback(onRtspHandle);

    mpp_dec = MppDecoderCreate(DECODE_TYPE_H264);
    if (!mpp_dec) {
        std::cout << "MppDecoderCreate error!\n" << std::endl;
        return -1;
    }

    rga = RgaCreate();
    if (!rga) {
        MppDecoderDestroy(mpp_dec);
        std::cout << "rgaCreate error!\n" << std::endl;
        return -1;
    }

    run_flag = 1;

    rtsp_client.enable();

    std::thread t_decode(decode_thread, rga);

    while (run_flag) {
        usleep(10000);
    }

    rtsp_client.disable();

    run_flag = 0;

    t_decode.join();

    RgaDestroy(rga);

    MppDecoderDestroy(mpp_dec);

    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_BUILD_TYPE Release)

set(CMAKE_C_COMPILER gcc)
set(CMAKE_CXX_COMPILER g++)

find_package(CURL REQUIRED)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(link_libs rockchip_rtsp rockchip_mpp curl rockchip_rga pthread 
opencv_core opencv_highgui opencv_imgcodecs)

add_executable(rtsp_ssd rtsp_ssd.cpp)
target_link_libraries(rtsp_ssd ${link_libs})

編譯

cd local_rtsp/build  
cmake ..  
make  
./rtsp_ssd  

運(yùn)行效果


參考:

  1. 瑞芯微社區(qū)Toybrick Debian 10用戶(hù)指南
  2. 瑞芯微社區(qū)RK3399Pro入門(mén)教程(7)RTSP庫(kù)的使用
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咏尝,一起剝皮案震驚了整個(gè)濱河市压语,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌编检,老刑警劉巖胎食,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異允懂,居然都是意外死亡厕怜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)蕾总,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)粥航,“玉大人,你說(shuō)我怎么就攤上這事生百〉萑福” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵蚀浆,是天一觀的道長(zhǎng)缀程。 經(jīng)常有香客問(wèn)我,道長(zhǎng)市俊,這世上最難降的妖魔是什么杨凑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮摆昧,結(jié)果婚禮上撩满,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好伺帘,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布昭躺。 她就那樣靜靜地躺著,像睡著了一般曼追。 火紅的嫁衣襯著肌膚如雪窍仰。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天礼殊,我揣著相機(jī)與錄音,去河邊找鬼针史。 笑死晶伦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的啄枕。 我是一名探鬼主播婚陪,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼频祝!你這毒婦竟也來(lái)了泌参?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤常空,失蹤者是張志新(化名)和其女友劉穎沽一,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體漓糙,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铣缠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昆禽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝗蛙。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖醉鳖,靈堂內(nèi)的尸體忽然破棺而出捡硅,到底是詐尸還是另有隱情,我是刑警寧澤盗棵,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布壮韭,位于F島的核電站,受9級(jí)特大地震影響漾根,放射性物質(zhì)發(fā)生泄漏泰涂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一辐怕、第九天 我趴在偏房一處隱蔽的房頂上張望逼蒙。 院中可真熱鬧,春花似錦寄疏、人聲如沸是牢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)驳棱。三九已至批什,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間社搅,已是汗流浹背驻债。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留形葬,地道東北人合呐。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像笙以,于是被迫代替她去往敵國(guó)和親淌实。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容