FFmpeg C++实现视频水印
时间: 2023-03-20 17:02:53 浏览: 156
ffmpeg视频教程全套 音视频直播水印culinary开发进阶C++/C
在使用FFmpeg实现视频水印时,通常的做法是将视频帧加载到内存中,然后在每一帧上添加水印,最后将带有水印的帧写入新的视频文件中。以下是一个简单的示例程序,它演示了如何使用FFmpeg在C语言中实现视频水印。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libavutil/imgutils.h>
#include <libavutil/parseutils.h>
#include <libavutil/opt.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#define INBUF_SIZE 4096
int main(int argc, char **argv) {
AVCodec *codec;
AVCodecContext *codec_ctx = NULL;
AVFormatContext *fmt_ctx = NULL;
AVOutputFormat *out_fmt = NULL;
AVStream *out_stream = NULL, *in_stream = NULL;
AVFrame *frame = NULL, *tmp_frame = NULL;
uint8_t inbuf[INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
uint8_t *data[4];
int data_linesize[4];
int ret, i;
int video_stream_index = -1;
int got_frame = 0;
AVPacket pkt;
char *watermark_file = "watermark.png"; // 水印图片路径
int watermark_x = 10, watermark_y = 10; // 水印位置
av_register_all();
// 打开输入文件
if ((ret = avformat_open_input(&fmt_ctx, argv[1], NULL, NULL)) < 0) {
fprintf(stderr, "Cannot open input file '%s': %s\n", argv[1], av_err2str(ret));
return 1;
}
// 查找输入流信息
if ((ret = avformat_find_stream_info(fmt_ctx, NULL)) < 0) {
fprintf(stderr, "Cannot find stream information: %s\n", av_err2str(ret));
return 1;
}
// 打印文件信息
av_dump_format(fmt_ctx, 0, argv[1], 0);
// 查找视频流
for (i = 0; i < fmt_ctx->nb_streams; i++) {
if (fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
in_stream = fmt_ctx->streams[i];
video_stream_index = i;
break;
}
}
if (!in_stream) {
fprintf(stderr, "No video stream found in the input file\n");
return 1;
}
// 获取编解码器
codec = avcodec_find_decoder(in_stream->codecpar->codec_id);
if (!codec) {
fprintf(stderr, "Unsupported codec!\n");
return 1;
}
// 打开编解码器上下文
codec_ctx = avcodec_alloc_context3(codec);
if (!codec_ctx) {
fprintf(stderr, "Failed to allocate codec context\n");
return 1;
}
if ((ret = avcodec_parameters_to_context(codec_ctx, in_stream->codecpar)) < 0) {
fprintf(stderr, "Failed to copy codec parameters to codec context: %s\n", av_err2str(ret));
return 1;
}
if
阅读全文