linux C++ H264 SRT 推流示例
时间: 2025-02-14 10:14:20 浏览: 74
### 使用 C++ 在 Linux 环境下通过 SRT 协议进行 H264 视频推流
为了实现这一目标,可以利用 `FFmpeg` 库来处理视频编码和解码操作,并结合 `SRT` 库来进行安全可靠的传输。下面是一个简单的例子,展示如何设置并启动一个基于 SRT 的 H264 流媒体服务器。
#### 安装依赖库
首先安装必要的软件包:
```bash
sudo apt-get update && sudo apt-get install -y \
build-essential cmake libssl-dev libsodium-dev pkg-config \
ffmpeg libavcodec-dev libavformat-dev libswscale-dev
```
接着下载编译最新的 `SRT` 源代码版本:
```bash
git clone https://github.com/Haivision/srt.git
cd srt
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install
ldconfig
```
#### 编写 C++ 推流程序
创建一个新的文件名为 `h264_srt_streamer.cpp` 并加入以下内容:
```cpp
extern "C" {
#include <libavutil/imgutils.h>
#include <libavutil/time.h>
#include <libavformat/avformat.h>
}
#include <iostream>
#include <srt/srt.h>
int main(int argc, char *argv[]) {
const char* url = "srt://127.0.0.1:8080?mode=listener";
AVFormatContext* fmt_ctx;
int ret;
av_register_all();
avformat_network_init();
// 创建输出上下文
if ((ret = avformat_alloc_output_context2(&fmt_ctx, NULL, "h264", url)) < 0) {
std::cerr << "Could not allocate output context." << std::endl;
return ret;
}
// 设置 SRT 特定选项
AVRational time_base{1, AV_TIME_BASE};
AVStream* out_stream = avformat_new_stream(fmt_ctx, nullptr);
out_stream->time_base = time_base;
out_stream->avg_frame_rate = {25, 1}; // 假设帧率为每秒25帧
// 打开URL连接
if (!(fmt_ctx->oformat->flags & AVFMT_NOFILE)) {
if ((ret = avio_open(&fmt_ctx->pb, url, AVIO_FLAG_WRITE)) < 0) {
std::cerr << "Cannot open URL '" << url << "'" << std::endl;
goto end;
}
}
// 写入头信息
if ((ret = avformat_write_header(fmt_ctx, nullptr)) < 0) {
std::cerr << "Error occurred when opening output URL\n";
goto end;
}
// 初始化SRT套接字配置参数
SRTSOCKET sock = srt_socket(AF_INET, SOCK_DGRAM, 0);
sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &(addr.sin_addr));
srt_setsockopt(sock, 0, SRTO_SENDER, (void*)&true, sizeof(bool));
srt_bind(sock, reinterpret_cast<sockaddr*>(&addr), sizeof(addr));
srt_listen(sock, 1);
while(true){
uint8_t packet_data[1024];
ssize_t bytes_read = fread(packet_data, 1, sizeof(packet_data), stdin);
if(bytes_read>0){
AVPacket pkt;
av_init_packet(&pkt);
pkt.data = packet_data;
pkt.size = static_cast<int>(bytes_read);
// 发送数据包到网络
if((ret = av_interleaved_write_frame(fmt_ctx,&pkt))!=0){
fprintf(stderr,"Error sending a packet.\n");
break;
}
}
}
end:
av_write_trailer(fmt_ctx);
avformat_free_context(fmt_ctx);
fclose(stdout);
}
```
此段代码展示了怎样初始化 FFmpeg 和 SRT 进行基本的数据打包发送过程[^2]。需要注意的是这只是一个非常基础的例子,在实际应用中还需要考虑更多细节比如错误处理、资源释放以及性能优化等问题。
阅读全文
相关推荐













