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)确保音视频同步。
  • 错误处理: 添加对异常情况的处理,如文件损坏或不支持的编码格式。
相关推荐
Antonio9152 小时前
【音视频】⾳频处理基本概念及⾳频重采样
ffmpeg·音视频·aac
电子科技圈3 小时前
XMOS空间音频——在任何设备上都能提供3D沉浸式空间音频且实现更安全地聆听
经验分享·设计模式·性能优化·计算机外设·音视频
18538162800余。6 小时前
碰一碰发视频源码搭建全解析,支持OEM
音视频
聂 可 以6 小时前
推荐几个免费提取音视频文案的工具(SRT格式、通义千问、飞书妙记、VideoCaptioner、AsrTools)
音视频·飞书·开源软件
Antonio9159 小时前
【音视频】AVIO输入模式
ffmpeg·音视频
科技小E10 小时前
EasyRTC音视频实时通话在线教育解决方案:打造沉浸式互动教学新体验
网络·音视频
炒香菇的书呆子11 小时前
基于亚马逊云科技构建音频转文本无服务器应用程序
科技·音视频
hunandede15 小时前
ffmpeg av_buffer_unref的逻辑实现; av_freep 和 av_freep函数的区别
ffmpeg
byte轻骑兵19 小时前
【HFP】蓝牙HFP协议中音频连接转移与拨号功能的深度解析
音视频·蓝牙技术·hfp
邪恶的贝利亚1 天前
一些有关ffmpeg 使用(1)
ffmpeg