目錄
一、上電自動掛載
二、RkMedia
2.1 認識 RkMedia
rtsp
rtmp
RTSP 和 RTMP 的選擇
2.2 安裝 VLC
2.2 RkMedia 例程使用
一、上電自動掛載
????????cd /etc/init.d/
????????vi Smyprofile.sh
????????添加這個內容
????????????????#!/bin/sh
????????????????ifconfig eth0 192.168.66.88
????????????????mount -t nfs 192.168.66.66:/home/lwl/share /MyProject?-o nolock
????????黑色加粗的部分改成自己板子的 IP
????????紅色的部分改成自己 Ubuntu 的 IP
????????綠色的部分改成自己的 Ubuntu 共享文件夾的路徑
????????藍色的部分改成板子共享文件夾的路徑
????????chmod 777 Smyprofile.sh
????????reboot
這一段時間主要做
????????音視頻的獲取
????????獲取音視頻之后,需要推流,保存到本地
????????最終需要合成一個 mp4 文件
????????三步走
????????????????第一步:視頻的獲取,視頻的推流,視頻的本地保存
????????????????第二步:音頻的獲取,音頻的推流,音頻的本地保存
????????????????第三步:音視頻合成,音視頻推流,音視頻本地保存
二、RkMedia
2.1 認識 RkMedia
????????瑞星微推出的一個閉源的音視頻開發庫
????????????????對 FFMPEG 進一步的封裝
????????只有部分瑞芯微的芯片支持這個庫
????????RkMedia 官方給我們的有例程 --- 可以參考使用
/home/wifi/driver/RV1126_RV1109_LINUX_SDK_V2.2.5.1_20231011/buildroot/output/rockchip_rv1126_rv1109_spi_nand/build/rkmedia/examples
????????VI(輸入視頻捕獲) --- Video Input --- 視頻輸入
????????VENC(H.265/H.264/JPEG/MJPEG 編碼) --- Video Encodec --- 視頻編碼
????????VDEC(H.265/H.264/JPEG、MJPEG 解碼) --- Video Decodec --- 視頻解碼
????????VO(視頻輸出顯示) --- Video Output --- 視頻輸出
????????RGA 視頻處理(包括旋轉、縮放、裁剪) --- 后續會用到
????????AI(音頻采集) --- Audio Input --- 音頻輸入
????????AO(音頻輸出) --- Audio Output --- 音頻輸出
????????AENC(音頻編碼) --- Audio Encodec --- 音頻編碼
????????ADEC(音頻解碼) --- Audio Decodec --- 音頻解碼
????????MD(移動偵測)
????????OD(遮擋偵測)
????????VMIX(視頻合成)
????????MUXER(視頻封裝)
????????VP(視頻一入四出)
rtsp
????????流媒體服務器
????????用來傳輸音視頻數據流的服務器解決方案
????????實時流傳輸協議(Real Time Streaming Protocol,RTSP),RFC2326(中文版),是 TCP/IP 協議體系中的一個應用層協議,由哥倫比亞大學、網景和RealNetworks 公司提交的 IETF RFC 標準。該協議定義了一對多應用程序如何有效地通過 IP 網絡傳送多媒體數據。RTSP 在體系結構上位于 RTP 和 RTCP 之上,它使用 TCP或 UDP 完成數據傳輸。 屬于一個應用層協議,它的傳輸層協議可以是 TCP,也可以是 UDP
rtmp
????????實時消息協議(英語:Real-Time Messaging Protocol,縮寫 RTMP)也稱實時消息傳輸協議。它是最初由 Macromedia 為通過互聯網在 Flash 播放器與一個服務器之間傳輸流媒體音頻、視頻和數據而開發的一個專有協議。Macromedia 后被 Adobe Systems 收購,該協議也已發布了不完整的規范供公眾使用。
RTSP 和 RTMP 的選擇
????????百度以下兩者的區別
????????????????RkMedia 中默認支持 RTSP 服務器端
????????????????????????RTSP 和 RTMP 都會分為服務器和客戶端
????????????????????????不同的端使用的 API 是不同的,依賴的庫也略有區別
????????????????????????如果要使用客戶端的 API,需要自己移植相關的庫
????????推流
????????????????客戶端將數據流發送給服務器:客戶端 → 服務器
????????拉流
????????????????客戶端從服務器獲取視頻流:服務器 → 客戶端
2.2 安裝 VLC
????????在 ubuntu 下安裝,需要切換一下網絡
????????在 Windows 下安裝,需要把網卡 IP 換成靜態 IP
????????可能影響到后續網口的使用
2.2 RkMedia 例程使用
????????./rkmedia_vi_venc_rtsp_test -a
????????出現下圖類似內容,即算成功
????????如果出現卡在
????????就執行:./rkmedia_vi_venc_rtsp_test
????????如果加上-a,卡在這里不動,就把-a 給去掉
????????拉流地址
????????????????rtsp://192.168.66.88/live/main_stream
????????????????加粗部分換成自己的板子 IP
????????當前的過程
????????目前的目標:根據官方的例程,去完善自己的程序
//用來設置攝像頭參數的 --- 必要的
rk_aiq_working_mode_t hdr_mode = RK_AIQ_WORKING_MODE_NORMAL;int fps = 30;SAMPLE_COMM_ISP_Init(s32CamId, hdr_mode, bMultictx, pIqfilesPath);SAMPLE_COMM_ISP_Run(s32CamId);SAMPLE_COMM_ISP_SetFrameRate(s32CamId, fps);
g_rtsplive = create_rtsp_demo(554);
g_rtsp_session = rtsp_new_session(g_rtsplive, "/live/main_stream");
rtsp_set_video(g_rtsp_session, RTSP_CODEC_ID_VIDEO_H264, NULL, 0);
rtsp_sync_video_ts(g_rtsp_session, rtsp_get_reltime(), rtsp_get_ntptime());
RK_MPI_SYS_Init();
RK_MPI_VI_SetChnAttr(s32CamId, 0, &vi_chn_attr);
RK_MPI_VI_EnableChn(s32CamId, 0);
RK_MPI_VENC_CreateChn(0, &venc_chn_attr);
RK_MPI_SYS_RegisterOutCb(&stEncChn, video_packet_cb);
RK_MPI_SYS_Bind(&stSrcChn, &stDestChn);
rtsp_del_demo(g_rtsplive);
RK_MPI_SYS_UnBind(&stSrcChn, &stDestChn);
RK_MPI_VENC_DestroyChn(0);
RK_MPI_VI_DisableChn(s32CamId, 0);
SAMPLE_COMM_ISP_Stop(s32CamId);
????????當前這個程序的功能只有推流,但是想讓他既可以推流又可以保存在本地
????????保存在本地
????????????????g_output_file = fopen(pOutPath, "w");
????????和錄制 PCM 音頻一樣
????????????????fwrite(RK_MPI_MB_GetPtr(mb), 1, RK_MPI_MB_GetSize(mb), g_output_file);
????????????????fclose(g_output_file);
????????工程的配置
????????配置工程的目的在于讓它有代碼提示
? ? ? ??依賴的頭文件?
#include <assert.h>
#include <fcntl.h>
#include <getopt.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
#include "common/sample_common.h"
#include "librtsp/rtsp_demo.h"
#include "rkmedia_api.h"
#include "rkmedia_venc.h"
?
主要講的是 RkMedia 的使用
在 RkMedia 生成的可執行程序路徑之下
????????找到相關的可執行程序
將可執行程序復制到共享文件夾
????????在板子運行可執行程序
????????./rkmedia_vi_venc_rtsp_test -a
可執行程序的源碼
????????rkmedia_vi_venc_rtsp_test.c
????????主要過程
????????ISP 初始化 --- 配置攝像頭參數
????????rtsp 初始化 --- 推流的程序
????????rtsp 的服務端
????????RK_MPI_SYS_Init --- RkMedia 系統初始化
????????RK_MPI_VI_SetChnAttr --- 設置輸入通道屬性
????????RK_MPI_VI_EnableChn --- 使能輸入通道
????????RK_MPI_VENC_CreateChn --- 創建編碼器通道
????????RK_MPI_SYS_RegisterOutCb?--- 創建輸出回調
????????RK_MPI_SYS_Bind --- 綁定通道
????????釋放一系列資源
????????既可以推流 --- 推流的過程就是上述過程
????????又可以本地保存 --- 實現原理 --- fopen 和 fwrite 和 fclose?