linux c++ 如何播放rtsp视频流
时间: 2023-09-26 16:12:09 浏览: 245
在Linux C++中播放RTSP视频流,您可以使用FFmpeg库来实现。FFmpeg是一个开源的跨平台音视频处理工具库,支持各种音视频格式的编解码、转换和处理。以下是使用FFmpeg库来播放RTSP视频流的基本步骤:
1. 安装FFmpeg库
在终端中输入以下命令安装FFmpeg库:
```
sudo apt-get install ffmpeg
```
2. 编写C++程序
在C++程序中,您需要使用FFmpeg库中的AVFormatContext、AVCodecContext、AVPacket和AVFrame等结构体和函数来实现视频流的解码和播放。以下是一个简单的示例程序:
```c++
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>
#include <libavutil/imgutils.h>
}
#define WIDTH 640
#define HEIGHT 480
int main(int argc, char** argv) {
if (argc != 2) {
std::cerr << "Usage: " << argv[0] << " <rtsp url>" << std::endl;
return 1;
}
av_register_all();
AVFormatContext* pFormatCtx = avformat_alloc_context();
if (avformat_open_input(&pFormatCtx, argv[1], NULL, NULL) != 0) {
std::cerr << "Could not open input file." << std::endl;
return 1;
}
if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
std::cerr << "Could not find stream information." << std::endl;
return 1;
}
int videoStream = -1;
for (int i = 0; i < pFormatCtx->nb_streams; i++) {
if (pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
videoStream = i;
break;
}
}
if (videoStream == -1) {
std::cerr << "Could not find video stream." << std::endl;
return 1;
}
AVCodecContext* pCodecCtx = avcodec_alloc_context3(NULL);
if (avcodec_parameters_to_context(pCodecCtx, pFormatCtx->streams[videoStream]->codecpar) < 0) {
std::cerr << "Could not copy codec parameters." << std::endl;
return 1;
}
AVCodec* pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
if (pCodec == NULL) {
std::cerr << "Could not find codec." << std::endl;
return 1;
}
if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) {
std::cerr << "Could not open codec." << std::endl;
return 1;
}
AVFrame* pFrame = av_frame_alloc();
AVFrame* pFrameRGB = av_frame_alloc();
uint8_t* buffer = (uint8_t*) av_malloc(av_image_get_buffer_size(AV_PIX_FMT_RGB24, WIDTH, HEIGHT, 1));
av_image_fill_arrays(pFrameRGB->data, pFrameRGB->linesize, buffer, AV_PIX_FMT_RGB24, WIDTH, HEIGHT, 1);
struct SwsContext* sws_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, WIDTH, HEIGHT, AV_PIX_FMT_RGB24, SWS_BILINEAR, NULL, NULL, NULL);
AVPacket packet;
while (av_read_frame(pFormatCtx, &packet) >= 0) {
if (packet.stream_index == videoStream) {
avcodec_send_packet(pCodecCtx, &packet);
while (avcodec_receive_frame(pCodecCtx, pFrame) == 0) {
sws_scale(sws_ctx, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);
// 在这里将RGB24格式的图像数据传输到视频显示器或编码为其它视频格式
av_frame_unref(pFrame);
}
}
av_packet_unref(&packet);
}
av_free(buffer);
av_frame_free(&pFrameRGB);
av_frame_free(&pFrame);
avcodec_close(pCodecCtx);
avformat_close_input(&pFormatCtx);
return 0;
}
```
3. 编译程序
在终端中输入以下命令编译程序:
```
g++ -o rtsp_play rtsp_play.cpp -lavformat -lavcodec -lavutil -lswscale
```
4. 运行程序
在终端中输入以下命令运行程序:
```
./rtsp_play <rtsp url>
```
其中,`<rtsp url>`是RTSP视频流的URL地址。程序会将视频流解码为RGB24格式的图像数据,并将其传输到视频显示器或编码为其它视频格式。您可以根据需要自行修改程序。
阅读全文