FFmpeg 解复用过程

本章使用 FFmpeg 进行多媒体文件解复用(Demuxing)过程的完整讲解。

流程概述

  1. 初始化 FFmpeg 库:加载多媒体处理所需的库。
  2. 打开输入文件:使用 FFmpeg 的 API 打开多媒体文件。
  3. 解析文件信息:读取文件的头部,分析其中的流信息。
  4. 提取流数据:从容器中提取视频流、音频流等数据。
  5. 写入输出文件(可选):将解复用后的数据保存为单独的文件。

使用 FFmpeg 命令行解复用

sh 复制代码
# 从 input.mp4 解复用视频流和音频流
ffmpeg -i input.mp4 -c:v copy -an output_video.h264  # 提取视频流
ffmpeg -i input.mp4 -c:a copy -vn output_audio.acc	# 提取音频流
  • -c:v copy:复制视频流(无需重新编码)
  • -an:忽略音频流
  • -c:a copy:复制音频流(无需重新编码)
  • -vn:忽略视频流

使用 FFmpeg API 进行解复用

以下是使用 C 编写的解复用代码示例

c 复制代码
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>

int main(int argc, char *argv[]) {
	if(argc < 2) {
		printf("Usage: %s <input file>\n", argv[0]);
		return -1;
	}

	const char *input_file = argv[1];
	AVFormatContext *fmt_ctx = NULL;
	AVPacket packet;

	// 初始化 FFmpeg 库
	av_register_all();		// 高版本不需要注册

	// 打开输入文件
	if(avformat_open_input(&fmt_ctx, input_file, NULL, NULL) < 0) {
		fprintf(stderr, "Could not open input file %s\n", input_file);
		return -1;
	}
	
	// 解析流信息
	if(avformat_find_stream_info(fmt_ctx, NULL) < 0 ){
		fprintf(stderr, "Could not find stream information\n");
		avformat_close_input(&fmt_ctx);
		return -1;
	}
	
	// 打印流信息
	av_dump_fromat(fmt_ctx, 0, input_file, 0);

	// 解复用或称:读取每个数据包并分类处理
	while(av_read_frame(fmt_ctx, &packet) >= 0){
		if(packet.stream_index == fmt_ctx->streams[0]->index) {
			// 视频流
			printf("Video packet size: %d\n", packet.size);
			// 从这里可以写入到文件或进一步处理
		} else if(packet.stream_index == fmt_ctx->streams[1]->index){
			// 音频流
			printf("Audio packet size: %d\n", packet.size);
			// 从这里可以写入到文件或进一步处理
		}
		av_packet_unref(&packet);
	} 
	
	// 释放资源
	avformat_close_input(&fmt_ctx);
	return 0;
} 

代码说明

  1. 初始化 FFmpeg 库:
c 复制代码
av_register_all();
  1. 打开输入文件:
c 复制代码
avformat_open_input(&fmt_ctx, input_file, NULL, NULL);

创建一个 AVFormatContext 对象,存储输入文件的信息。

  1. 解析文件信息:
c 复制代码
avformat_find_stream_info(fmt_ctx, NULL);

分析文件头部,获取流信息。

  1. 读取数据包:
c 复制代码
while(av_read_frame(fmt_ctx, &packet) >= 0) { ... }

按帧读取数据包,并根据 stream_index 将其分为视频流或音频流。

  1. 处理流数据:
  • 视频流:写入 .h264 文件。
  • 音频流:写入 .aac 文件。
  1. 释放资源:
c 复制代码
avformat_close_input(&fmt_ctx);

释放内存,关闭文件。

扩展与优化

  • 多线程: 可以优化解复用速度。
  • 音视频同步: 使用时间戳(PTS 和 DTS)确保音视频同步。
  • 错误处理: 添加对异常情况的处理,如文件损坏或不支持的编码格式。
相关推荐
辰辰观影14 分钟前
Windows网盘视频播放器推荐:无广告4K HDR怎么选
音视频
2601_966827452 小时前
电视端云盘在线播放怎么选?支持4K HDR的应用推荐
音视频
开开心心就好3 小时前
音频降噪剪辑工具,音量裁剪一键处理
运维·服务器·前端·spring·ocr·音视频·1024程序员节
zslefour6 小时前
使用ffmpeg遍历获取音频文件相关信息
ffmpeg
AI视频工具指南7 小时前
AI视频的声音和画面怎么配合?先分清谁在传递信息
人工智能·aigc·音视频
辰辰观影9 小时前
无广告播放器推荐来啦
音视频
TrueDei9 小时前
GStreamer 使用 valve 分别控制音视频流的暂停与恢复
音视频
Android系统攻城狮9 小时前
Linux FFmpeg深度解析之avcodec_parameters_from_context调用流程与实战(十六)
linux·运维·ffmpeg·音视频进阶·ffmpeg音视频·车载音视频进阶
一条破秋裤10 小时前
基于 Hi3516CV610 的立定跳远视频测量系统调研与实施方案
arm开发·音视频
Android系统攻城狮10 小时前
Linux FFmpeg深度解析之avcodec_alloc_context3调用流程与实战(十四)
linux·运维·ffmpeg·车载音视频·音视频进阶·ffmpeg音视频进阶