一、项目思路
实时监控系统/直播系统,通过V4L2接口从摄像头采集YUYV格式的视频;用H264对视频数据进行编码;然后通过RTMP协议发送至支持了rtmp的nginx流媒体服务器;用客户端使用VLC从服务器拉流显示。
V4L2----->H264----->RTMP------>nginx------>VLC
二、配置环境
2.1、获取X264库源码
git config --global http.sslVerify false //解决ssl证书验证失败的问题
git clone VideoLAN / x264 · GitLab //下载代码
2.2、编译安装X264库
2.2.1、编译安装nasm
1)下载地址:Index of /pub/nasm/releasebuilds 需要下载2.13版本的
2)下载后复制到ubuntu
tar -xvf nasm-2.13.tar.gz
cd nasm-2.13/
3)配置编译nasm
sudo ./configure
sudo make
sudo make install
2.2.2、编译安装x264库
cd x264
sudo ./configure --enable-shared --enable-static --prefix=/usr
sudo make
sudo make install
三、H264
H264压缩图像是一个序列一个序列压缩的,一个序列中的多个帧基本是相似度非常高的图像,在一个序列中的第一个图像叫做IDR图像(立即刷新图像),IDR图像都是I帧图像。H264引入IDR图像是为了解码的重同步,当解码器解码到IDR图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。本设计只是用了H.264的编码部分,使用目前最为流行,性能最好的X264作为编码器
四、源代码
1.cam.c
2.X264_Code.h
#ifndef __X264_Code__
#define __X264_Code__
#include <stdint.h>
#include <x264.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//编码器信息相关结构体
typedef struct encode{
x264_param_t param; //相关配置信息
x264_nal_t *nal; //NAL单元 编码之后存储的NAL单元
x264_picture_t picture; //H264图像,主要是用来存YUV分量的
x264_t *handle; //编码器指针
}Encode;
//SPS和PPS相关结构体 ----单独的存放SPS和PPS
typedef struct sps_pps{
uint8_t * sps; //sps内容
uint8_t * pps; //pps内容
uint32_t sps_len; //sps长度
uint32_t pps_len; //pps长度
}sps_pps;
typedef struct sps_pps_buf{
char *buf; //sps和pps的NAL单元 0x00 00 00 01+SPS+0x00 00 00 01+PPS
unsigned int length; //sps+pps的大