ffmpeg+rtsp+dss

1. push stream to dss

ffmpeg -f mpegts -re -i film.v -c:v libx264 -s 352x288 -aspect 4:3 -b:v 300k -c:a libfaac  -ac 1  -f rtsp 'rtsp://127.0.0.1/live1.sdp'


2. play stream from dss

ffmpeg -i 'rtsp://test:test@192.168.137.66:554/live1.sdp'  -an -c:v rawvideo -s 352x288 -f rawvideo  v1.yuv

ffmpeg -i 'rtsp://192.168.137.66:8000/live1.sdp' -an -c:v rawvideo -s 352x288 -f rawvideo  v1.yuv

ffmpeg -i 'rtsp://192.168.137.66:8000/live1' -an -c:v rawvideo -s 352x288 -f rawvideo  v1.yuv

转载自:http://blog.csdn.net/fanbird2008/article/details/9044885

C++结合FFmpeg可以实现对RTSP流的拉取和处理。下面是一个使用C++和FFmpeg的示例代码,用于拉取RTSP流并将其保存为本地文件: ```cpp #include <iostream> #include <fstream> #include <string> #include <thread> #include <chrono> extern "C" { #include <libavformat/avformat.h> } int main() { // 初始化FFmpeg库 av_register_all(); // 创建AVFormatContext对象 AVFormatContext* formatContext = avformat_alloc_context(); // 设置RTSP地址 std::string rtspUrl = "rtsp://example.com/stream"; // 打开RTSP流 if (avformat_open_input(&formatContext, rtspUrl.c_str(), nullptr, nullptr) != 0) { std::cerr << "无法打开RTSP流" << std::endl; return -1; } // 查找流信息 if (avformat_find_stream_info(formatContext, nullptr) < 0) { std::cerr << "无法获取流信息" << std::endl; return -1; } // 找到视频流索引 int videoStreamIndex = -1; for (unsigned int i = 0; i < formatContext->nb_streams; i++) { if (formatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { videoStreamIndex = i; break; } } // 检查是否找到视频流 if (videoStreamIndex == -1) { std::cerr << "未找到视频流" << std::endl; return -1; } // 获取视频流的解码器参数 AVCodecParameters* codecParameters = formatContext->streams[videoStreamIndex]->codecpar; // 查找视频流的解码器 AVCodec* codec = avcodec_find_decoder(codecParameters->codec_id); if (codec == nullptr) { std::cerr << "未找到解码器" << std::endl; return -1; } // 创建解码器上下文 AVCodecContext* codecContext = avcodec_alloc_context3(codec); if (codecContext == nullptr) { std::cerr << "无法创建解码器上下文" << std::endl; return -1; } // 将解码器参数复制到解码器上下文 if (avcodec_parameters_to_context(codecContext, codecParameters) < 0) { std::cerr << "无法复制解码器参数到解码器上下文" << std::endl; return -1; } // 打开解码器 if (avcodec_open2(codecContext, codec, nullptr) < 0) { std::cerr << "无法打开解码器" << std::endl; return -1; } // 创建AVPacket对象 AVPacket* packet = av_packet_alloc(); // 创建AVFrame对象 AVFrame* frame = av_frame_alloc(); // 创建输出文件 std::ofstream outputFile("output.yuv", std::ios::binary); // 读取并保存视频帧 while (av_read_frame(formatContext, packet) >= 0) { // 检查是否为视频流 if (packet->stream_index == videoStreamIndex) { // 解码视频帧 avcodec_send_packet(codecContext, packet); while (avcodec_receive_frame(codecContext, frame) == 0) { // 将YUV数据写入文件 for (int y = 0; y < frame->height; y++) { outputFile.write(reinterpret_cast<char*>(frame->data[0] + y * frame->linesize[0]), frame->width); } for (int y = 0; y < frame->height / 2; y++) { outputFile.write(reinterpret_cast<char*>(frame->data[1] + y * frame->linesize[1]), frame->width / 2); outputFile.write(reinterpret_cast<char*>(frame->data[2] + y * frame->linesize[2]), frame->width / 2); } } } // 释放AVPacket对象 av_packet_unref(packet); // 暂停一段时间,模拟实时处理 std::this_thread::sleep_for(std::chrono::milliseconds(10)); } // 释放AVFrame对象 av_frame_free(&frame); // 释放AVPacket对象 av_packet_free(&packet); // 关闭解码器 avcodec_close(codecContext); // 释放解码器上下文 avcodec_free_context(&codecContext); // 关闭输入流 avformat_close_input(&formatContext); // 释放AVFormatContext对象 avformat_free_context(formatContext); // 关闭输出文件 outputFile.close(); return 0; } ``` 这段代码使用FFmpeg库打开RTSP流,查找视频流并解码视频帧,然后将YUV数据保存到本地文件中。你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值