21xrx.com
2025-04-14 09:41:32 Monday
文章检索 我的文章 写文章
使用ffmpeg C语言进行视频合并
2023-10-17 00:14:06 深夜i     73     0
ffmpeg C语言 视频合并

使用FFmpeg是一种非常流行的方法,可以使用C语言合并视频。FFmpeg是一个开源的跨平台解码器、编码器和转码器,可以处理几乎所有的音视频格式。通过使用FFmpeg的库和函数,我们可以轻松地合并多个视频文件。

首先,我们需要为我们的程序包含FFmpeg的头文件。包含头文件后,我们需要初始化FFmpeg的库,并打开输入和输出文件。

#include <stdio.h>
#include <libavformat/avformat.h>
int main() {
  av_register_all(); // 初始化FFmpeg的库
  
  AVFormatContext *inputContext1 = avformat_alloc_context();
  AVFormatContext *inputContext2 = avformat_alloc_context();
  
  AVFormatContext *outputContext = avformat_alloc_context();
  
  // 打开输入文件1
  if (avformat_open_input(&inputContext1, "input1.mp4", NULL, NULL) != 0) {
    printf("无法打开输入文件1\n");
    return -1;
  }
  
  // 打开输入文件2
  if (avformat_open_input(&inputContext2, "input2.mp4", NULL, NULL) != 0) {
    printf("无法打开输入文件2\n");
    return -1;
  }
  
  // 创建输出文件
  if (avformat_alloc_output_context2(&outputContext, NULL, NULL, "output.mp4") < 0) {
    printf("无法创建输出文件\n");
    return -1;
  }
  
  // 将输入流复制到输出文件
  for (int i = 0; i < inputContext1->nb_streams; i++) {
    AVStream *inStream = inputContext1->streams[i];
    AVStream *outStream = avformat_new_stream(outputContext, inStream->codec->codec);
    
    if (avcodec_copy_context(outStream->codec, inStream->codec) < 0) {
      printf("无法复制编码器上下文\n");
      return -1;
    }
    
    outStream->codec->codec_tag = 0;
  }
  
  // 将输入流复制到输出文件
  for (int i = 0; i < inputContext2->nb_streams; i++) {
    AVStream *inStream = inputContext2->streams[i];
    AVStream *outStream = avformat_new_stream(outputContext, inStream->codec->codec);
    
    if (avcodec_copy_context(outStream->codec, inStream->codec) < 0) {
      printf("无法复制编码器上下文\n");
      return -1;
    }
    
    outStream->codec->codec_tag = 0;
  }
  
  // 打开输出文件
  if (!(outputContext->flags & AVFMT_NOFILE)) {
    if (avio_open(&outputContext->pb, "output.mp4", AVIO_FLAG_WRITE) < 0) {
      printf("无法打开输出文件\n");
      return -1;
    }
  }
  
  // 写入文件头
  if (avformat_write_header(outputContext, NULL) < 0) {
    printf("无法写入文件头\n");
    return -1;
  }
  
  // 读取和写入视频帧
  AVPacket packet;
  while (av_read_frame(inputContext1, &packet) >= 0) {
    packet.stream_index = 0// 设置流索引
    
    av_interleaved_write_frame(outputContext, &packet); // 写入帧
    
    av_free_packet(&packet);
  }
  
  while (av_read_frame(inputContext2, &packet) >= 0) {
    packet.stream_index = 1// 设置流索引
    
    av_interleaved_write_frame(outputContext, &packet); // 写入帧
    
    av_free_packet(&packet);
  }
  
  // 写入文件尾
  av_write_trailer(outputContext);
  
  // 关闭输入和输出文件
  avformat_close_input(&inputContext1);
  avformat_close_input(&inputContext2);
  
  avformat_free_context(outputContext);
  
  return 0;
}

上面的代码中,我们首先初始化FFmpeg库并打开输入文件1和输入文件2。然后,我们创建一个输出文件并将输入流复制到输出文件。最后,我们读取和写入视频帧,写入文件头和文件尾,并关闭输入和输出文件。

通过使用FFmpeg的库和函数,我们可以在C语言中轻松地合并视频文件。希望这篇文章对你有帮助!

  
  

评论区