水印AVFrame加入图片AVFrame中的C++完整代码
时间: 2023-03-23 19:01:24 浏览: 162
以下是将水印AVFrame添加到图像AVFrame中的完整C代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
#include <math.h>
#include <pthread.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>
#include <libavutil/opt.h>
#include <libavutil/imgutils.h>
int main(int argc, char *argv[]) {
if (argc < 4) {
printf("Usage: %s input_file watermark_file output_file\n", argv[0]);
return 0;
}
av_register_all();
// 打开输入文件
AVFormatContext *input_ctx = NULL;
if (avformat_open_input(&input_ctx, argv[1], NULL, NULL) != 0) {
printf("Failed to open input file: %s\n", argv[1]);
return -1;
}
if (avformat_find_stream_info(input_ctx, NULL) < 0) {
printf("Failed to retrieve input stream information\n");
return -1;
}
// 查找视频流索引
int video_stream_index = -1;
for (int i = 0; i < input_ctx->nb_streams; i++) {
if (input_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
video_stream_index = i;
break;
}
}
if (video_stream_index == -1) {
printf("Failed to find video stream\n");
return -1;
}
// 打开视频解码器
AVCodecParameters *codec_params = input_ctx->streams[video_stream_index]->codecpar;
AVCodec *decoder = avcodec_find_decoder(codec_params->codec_id);
AVCodecContext *decoder_ctx = avcodec_alloc_context3(decoder);
if (avcodec_parameters_to_context(decoder_ctx, codec_params) < 0) {
printf("Failed to copy codec parameters to decoder context\n");
return -1;
}
if (avcodec_open2(decoder_ctx, decoder, NULL) < 0) {
printf("Failed to open video decoder\n");
return -1;
}
// 打开输出文件
AVFormatContext *output_ctx = NULL;
if (avformat_alloc_output_context2(&output_ctx, NULL, NULL, argv[3]) < 0) {
printf("Failed to create output context\n");
return -1;
}
// 添加视频流到输出文件
AVStream *video_stream = avformat_new_stream(output_ctx, NULL);
if (video_stream == NULL) {
printf("Failed to create new video stream\n");
return -1;
}
// 复制解码器参数到输出流
if (avcodec_parameters_copy(video_stream->codecpar, codec_params) < 0) {
printf("Failed to copy codec parameters to output stream\n");
return -1;
}
// 打开视频编码器
AVCodec *encoder = avcodec_find_encoder(codec_params->codec_id);
AVCodecContext *encoder_ctx = avcodec_alloc_context3(encoder);
if (avcodec_parameters_to_context(encoder_ctx, codec_params) < 0) {
printf("Failed to copy codec parameters to encoder context\n");
return -1;
}
if (avcodec_open2(encoder_ctx, encoder, NULL) < 0) {
阅读全文