最简单的基于 FFmpeg 的视音频复用器

本文介绍了如何使用FFmpeg将H.264视频和AAC音频合并到MKV等封装格式文件中,通过AVFormatContext和相关函数如av_read_frame进行数据处理,提供了一个实际示例和可供下载的工程文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最简单的基于 FFmpeg 的视音频复用器

参考雷霄骅博士的文章,链接:最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)

正文

本文介绍一个视音频复用器(Muxer)。

视音频复用器(Muxer)即是将视频压缩数据(例如 H.264)和音频压缩数据(例如 AAC)合并到一个封装格式数据(例如MKV)中去。如下图所示。

在这里插入图片描述

在这个过程中并不涉及到编码和解码。

本文记录的程序将一个 H.264 编码的视频码流文件和一个 MP3 编码的音频码流文件,合成为一个 MP4 封装格式的文件。

程序的流程如下图所示:

在这里插入图片描述

从流程图中可以看出,一共初始化了 3 个 AVFormatContext,其中 2 个用于输入,1 个用于输出。3 个 AVFormatContext 初始化之后,通过 avcodec_copy_context() 函数可以将输入视频/音频的参数拷贝至输出视频/音频的 AVCodecContext 结构体。然后分别分别调用视频输入流和音频输入流的 av_read_frame(),从视频输入流中取出视频的 AVPacket,音频输入流中取出音频的 AVPacket,分别将取出的 AVPacket 写入到输出文件中即可。其间用到了一个不太常见的函数 av_compare_ts(),是比较时间戳用的。通过该函数可以决定该写入视频还是音频。

本文介绍的视音频复用器,输入的视频不一定是 H.264 裸流文件,音频也不一定是纯音频文件。可以选择两个封装过的视音频文件作为输入。程序会从视频输入文件中“挑”出视频流,音频输入文件中“挑”出音频流,再将“挑选”出来的视音频流复用起来。

对于某些封装格式(例如 MP4/FLV/MKV 等)中的 H.264,需要用到名称为“h264_mp4toannexb”的 bitstream filter。这一点在前一篇文章《最简单的基于 FFmpeg 的视音频分离器 - 简化版》中,已经有过详细叙述,这里不再重复。

对于某些封装格式(例如 MP4/FLV/MKV 等)中的 AAC,需要用到名称为“aac_adtstoasc”的 bitstream filter。

简单介绍一下流程中各个重要函数的意义:

  1. avformat_open_input():打开输入文件。
  2. avcodec_copy_context():赋值 AVCodecContext 的参数。
  3. avformat_alloc_output_context2():初始化输出文件。
  4. avio_open():打开输出文件。
  5. avformat_write_header():写入文件头。
  6. av_compare_ts():比较时间戳,决定写入视频还是写入音频。这个函数相对要少见一些。
  7. av_read_frame():从输入文件读取一个 AVPacket。
  8. av_interleaved_write_frame():写入一个 AVPacket 到输出文件。
  9. av_write_trailer():写入文件尾。

源程序:


结果

运行程序,输出如下:

在这里插入图片描述

输入文件为:
视频:cuc_ieschool.ts
音频:huoyuanjia.mp3

输出文件为:cuc_ieschool.mp4

输出的文件视频为“cuc_ieschool”,配合“霍元甲”的音频。

工程文件下载

GitHub:UestcXiye / Simplest-FFmpeg-Muxer

CSDN:Simplest FFmpeg Muxer.zip

参考链接

  1. 最简单的基于 FFmpeg 的视音频分离器 - 简化版
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值