目录
一、上电自动挂载
二、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