ffmpeg api 录制视频
时间: 2023-10-12 22:04:42 浏览: 119
你可以使用FFmpeg API来录制视频。以下是一个简单的示例代码,演示了如何使用FFmpeg API录制视频:
```cpp
extern "C" {
#include <libavformat/avformat.h>
#include <libavutil/imgutils.h>
}
int main() {
AVFormatContext *outputContext = nullptr;
AVOutputFormat *outputFormat = nullptr;
AVStream *outputStream = nullptr;
AVCodecContext *codecContext = nullptr;
AVFrame *frame = nullptr;
AVPacket packet;
// 输出视频参数
const char *outputFilename = "output.mp4";
int videoWidth = 1280;
int videoHeight = 720;
AVRational videoTimeBase = {1, 30}; // 视频帧率为30fps
av_register_all();
// 创建输出上下文
avformat_alloc_output_context2(&outputContext, nullptr, nullptr, outputFilename);
if (!outputContext) {
// 错误处理
return -1;
}
// 设置输出格式
outputFormat = outputContext->oformat;
// 创建输出流
outputStream = avformat_new_stream(outputContext, nullptr);
if (!outputStream) {
// 错误处理
return -1;
}
// 设置编码参数
codecContext = outputStream->codec;
codecContext->codec_id = outputFormat->video_codec;
codecContext->codec_type = AVMEDIA_TYPE_VIDEO;
codecContext->pix_fmt = AV_PIX_FMT_YUV420P;
codecContext->width = videoWidth;
codecContext->height = videoHeight;
codecContext->time_base = videoTimeBase;
// 打开编码器
if (avcodec_open2(codecContext, avcodec_find_encoder(codecContext->codec_id), nullptr) < 0) {
// 错误处理
return -1;
}
// 分配帧内存
frame = av_frame_alloc();
frame->format = codecContext->pix_fmt;
frame->width = codecContext->width;
frame->height = codecContext->height;
// 分配帧数据缓冲区
int bufferSize = av_image_get_buffer_size(codecContext->pix_fmt, codecContext->width, codecContext->height, 1);
uint8_t *buffer = (uint8_t *)av_malloc(bufferSize);
av_image_fill_arrays(frame->data, frame->linesize, buffer, codecContext->pix_fmt, codecContext->width, codecContext->height, 1);
// 打开输出文件
if (!(outputFormat->flags & AVFMT_NOFILE)) {
if (avio_open(&outputContext->pb, outputFilename, AVIO_FLAG_WRITE) < 0) {
// 错误处理
return -1;
}
}
// 写入文件头
if (avformat_write_header(outputContext, nullptr) < 0) {
// 错误处理
return -1;
}
// 录制视频帧
for (;;) {
// 从摄像头或其他源获取视频帧,将其存储在frame中
// 将视频帧写入输出流
av_init_packet(&packet);
packet.data = nullptr;
packet.size = 0;
avcodec_send_frame(codecContext, frame);
while (avcodec_receive_packet(codecContext, &packet) == 0) {
av_interleaved_write_frame(outputContext, &packet);
av_packet_unref(&packet);
}
阅读全文