使用c++ 用FFMPEG 将视频流保存成录像
要使用C++和FFmpeg将视频流保存为录像,您需要按照以下步骤进行操作:
-
首先,您需要安装FFmpeg库并配置好开发环境。可以从FFmpeg官方网站下载最新版本的库文件,并将其添加到您的项目中。
-
在C++代码中,您需要包含FFmpeg的头文件,如下所示:
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/imgutils.h>
#include <libswscale/swscale.h>
}
- 创建一个AVFormatContext对象,该对象将用于保存输出视频的相关信息。然后,通过调用avformat_alloc_output_context2函数为输出视频文件分配格式上下文。
AVFormatContext* formatContext = nullptr;
avformat_alloc_output_context2(&formatContext, nullptr, nullptr, "output.mp4");
- 打开输出视频文件并创建一个AVStream对象,该对象将用于保存视频流的相关信息。然后,通过调用avcodec_find_encoder函数找到适合的视频编码器,并通过调用avcodec_open2函数打开编码器。
AVStream* stream = avformat_new_stream(formatContext, nullptr);
AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_H264);
AVCodecContext* codecContext = avcodec_alloc_context3(codec);
avcodec_open2(codecContext, codec, nullptr);
- 将视频流的相关信息填充到AVStream对象中,并将AVCodecContext对象与AVStream对象相关联。
stream->codecpar->codec_id = codec->id;
stream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
stream->codecpar->width = width;
stream->codecpar->height = height;
avcodec_parameters_from_context(stream->codecpar, codecContext);
- 打开输出视频文件并写入文件头。
avio_open(&formatContext->pb, "output.mp4", AVIO_FLAG_WRITE);
avformat_write_header(formatContext, nullptr);
- 从输入视频流中读取视频帧,并将其编码为输出视频格式。然后,将编码后的帧写入输出视频文件。
AVFrame* frame = av_frame_alloc();
AVPacket* packet = av_packet_alloc();
while (av_read_frame(inputFormatContext, packet) >= 0) {
if (packet->stream_index == videoStreamIndex) {
avcodec_send_packet(codecContext, packet);
avcodec_receive_frame(codecContext, frame);
// 编码后的帧写入输出视频文件
avcodec_send_frame(codecContext, frame);
while (avcodec_receive_packet(codecContext, packet) == 0) {
av_interleaved_write_frame(formatContext, packet);
}
}
av_packet_unref(packet);
}
// 刷新编码器缓冲区并写入文件尾
avcodec_send_frame(codecContext, nullptr);
while (avcodec_receive_packet(codecContext, packet) == 0) {
av_interleaved_write_frame(formatContext, packet);
}
av_write_trailer(formatContext);
- 释放所有分配的资源。
av_packet_free(&packet);
av_frame_free(&frame);
avcodec_free_context(&codecContext);
avformat_close_input(&inputFormatContext);
avformat_free_context(formatContext);
这些步骤涵盖了使用C++和FFmpeg将视频流保存为录像的基本过程。您可能需要根据您的需求进行一些调整和优化
原文地址: https://www.cveoy.top/t/topic/hBCD 著作权归作者所有。请勿转载和采集!