简介
- ffmpeg C开发 常用技巧
ffmpeg AVPacket 初始化和反初始化
- av_init_packet()函数被弃用了
- 应该使用 av_packet_alloc()函数对packet进行申请,使用av_packet_free()函数继续释放
ffmpeg AVFrame 转 cv::Mat
上面函数传入的参数frame中的图像格式,可以是YUV, RGB ,等等,,经过sws_scale()转换之后,写入cv::Mat 数据区。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19//AVFrame 转 cv::mat
cv::Mat frame_to_mat(const AVFrame * frame) {
int width = frame->width;
int height = frame->height;
cv::Mat image(height, width, CV_8UC3);
int cvLinesizes[1];
cvLinesizes[0] = image.step1();
if( NULL == _swsContext) {
_swsContext = sws_getContext(width, height,
(AVPixelFormat)frame->format, width, height,
AVPixelFormat::AV_PIX_FMT_BGR24, SWS_FAST_BILINEAR, NULL, NULL, NULL);
}
sws_scale(_swsContext, frame->data,
frame->linesize, 0, height, &image.data, cvLinesizes);
return image;
}还有一种方式 是直接将AVFrame 中的RGB数据赋值给cv::Mat
1
2
3cv::Mat img;
img = cv::Mat(height, width, CV_8UC3);
img.data = _rgb_frame->data[0];
ffmpeg开发库 C++ 输入rtsp流地址 录制指定长度的视频到本地 编程示例
要使用FFmpeg的C++开发库来录制指定长度的RTSP流视频到本地,你可以使用libavcodec、libavformat等库来完成。下面是一个简单的示例代码:
1 | extern "C" { |
在这个示例中,我们首先初始化了FFmpeg库,然后打开了指定的RTSP流。我们创建了一个输出格式上下文,并且设置了输出文件名。然后,我们复制了输入流的编解码参数到输出流,接着开始逐帧读取输入流,并将其写入输出流。当录制时长达到指定时长后,我们退出录制,并释放相关资源。请确保将 rtsp_url
替换为你的 RTSP 流地址,output_file
为输出文件的路径和名称,duration
为录制时长(以秒为单位)。