c++ ffmpeg库的使用

本文介绍如何在Windows和Linux环境下使用FFmpeg SDK进行音视频处理,包括编解码、格式转换等核心功能。文章提供了C++示例代码,展示了如何在工程中引用FFmpeg库,以及获取支持的协议、格式、编解码器和过滤器信息。

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

下载ffmpegsdk:

ffmpeg-4.1.1-win32-dev:包含头文件和lib库

ffmpeg-4.1.1-win32-shared:包含动态库和可执行程序

https://ffmpeg.zeranoe.com/builds/

 C++工程引用

 

 

 

// SimpleFFmpeg.cpp : 定义控制台应用程序的入口点。
//

#include <stdio.h>

#define __STDC_CONSTANT_MACROS
#pragma warning(disable:4996)

#ifdef _WIN32
//windows
#ifdef __cplusplus
extern "C"
{
#endif
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavfilter/avfilter.h"
#ifdef __cplusplus
}
#endif
#else
//linux
#ifdef __cplusplus
extern "C"
{
#endif
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavfilter/avfilter.h"
#ifdef __cplusplus
}
#endif
#endif

//FIX
struct URLProtocol;

/**
 * Protocol Support Information
 */
char * urlprotocolinfo()
{
	char* info = (char*)malloc(40000);
	memset(info, 0, 40000);
	av_register_all();

	struct URLProtocol *pup = NULL;
	//input
	struct URLProtocol **p_temp = &pup;
	avio_enum_protocols((void **)p_temp,0);
	while ((*p_temp) != NULL)
	{
		sprintf(info, "%s[In][%10s]\n", info, avio_enum_protocols((void **)p_temp, 0));
	}
	pup = NULL;
	//output
	avio_enum_protocols((void**)p_temp, 1);
	while ((*p_temp) != NULL)
	{
		sprintf(info, "%s[Out][%10s]\n", info, avio_enum_protocols((void**)p_temp, 1));
	}
	return info;
}


/**
 * AVFormat Support information
 */
char * avformatinfo()
{
	char* info = (char*)malloc(40000);
	memset(info, 0, 40000);
	av_register_all();
	AVInputFormat *if_temp = av_iformat_next(NULL);
	AVOutputFormat *of_temp = av_oformat_next(NULL);
	//input
	while (if_temp != NULL)
	{
		sprintf(info, "%s[In] %10s\n", info, if_temp->name);
		if_temp = if_temp->next;
	}
	//output
	while (of_temp != NULL)
	{
		sprintf(info, "%s[In] %10s\n", info, of_temp->name);
		of_temp = of_temp->next;
	}
	return info;
}

/**
 * AVCodec Support Information
 */
char* avcodecinfo()
{
	char* info = (char*)malloc(40000);
	memset(info, 0, 40000);
	av_register_all();

	AVCodec* c_temp = av_codec_next(NULL);
	while (c_temp != NULL)
	{
		if (c_temp->decode != NULL)
		{
			sprintf(info, "%s[Dec]", info);
		}
		else
		{
			sprintf(info, "%s[Enc]", info);
		}
		switch (c_temp->type)
		{
		case AVMEDIA_TYPE_VIDEO:
			sprintf(info, "%s[Video]", info);
			break;
		case AVMEDIA_TYPE_AUDIO:
			sprintf(info, "%s[Audio]", info);
			break;
		default:
			sprintf(info, "%s[Other]", info);
			break;
		}
		sprintf(info, "%s %10s\n", info, c_temp->name);
		c_temp = c_temp->next;
	}
	return info;
}

/** 
 * AVFilter Support Information
 */
char* avfilterinfo()
{
	char* info = (char*)malloc(40000);
	memset(info,0,40000);
	avfilter_register_all();

	AVFilter *f_temp = (AVFilter*)avfilter_next(NULL);
	while (f_temp != NULL)
	{
		sprintf(info, "%s[%15s]\n", info, f_temp->name);
		f_temp = f_temp->next;
	}
	return info;
}


/*
 * Configuration Information
 */
char* configurationinfo()
{
	char* info = (char*)malloc(40000);
	memset(info, 0, 40000);
	av_register_all();
	sprintf(info, "%s\n", avcodec_configuration());

	return info;
}

int main()
{
	char* infostr = NULL;
	infostr = configurationinfo();
	printf("\n<<Configuration>>\n%s", infostr);
	free(infostr);

	infostr = urlprotocolinfo();
	printf("\n<<URLProtocol>>\n%s", infostr);
	free(infostr);

	infostr = avformatinfo();
	printf("\n<<AVFormat>>\n%s", infostr);
	free(infostr);

	infostr = avcodecinfo();
	printf("\n<<AVCodec>>\n%s", infostr);
	free(infostr);

	infostr = avfilterinfo();
	printf("\n<<AVFilter>>\n%s", infostr);
	free(infostr);
    return 0;
}

 

### 使用C++FFmpeg进行推流的实现示例与教程 #### 1. 初始化FFmpeg环境 为了使用FFmpeg,首先需要初始化AVFormatContext结构体并打开输出文件。这一步骤对于设置编码参数至关重要。 ```cpp #include <libavformat/avformat.h> // ...其他必要的头文件... int main(int argc, char *argv[]) { av_register_all(); AVOutputFormat *ofmt = NULL; AVFormatContext *ifmt_ctx = NULL, *ofmt_ctx = NULL; // 打开输入文件... } ``` 此部分代码展示了如何注册所有可用的编解码器以及创建用于处理多媒体容器格式的对象[^1]。 #### 2. 设置编码器配置 接着定义视频或音频流的具体属性,比如分辨率、帧率等,并分配相应的编码上下文给每条轨道。 ```cpp for (size_t i = 0; i < ofmt_ctx->nb_streams; ++i) { AVStream *out_stream = ofmt_ctx->streams[i]; AVCodecParameters *codecpar = out_stream->codecpar; const AVCodec *encoder = avcodec_find_encoder(codecpar->codec_id); if (!encoder) { fprintf(stderr, "Failed to find encoder\n"); return -1; } AVCodecContext *enc_ctx = avcodec_alloc_context3(encoder); if (!enc_ctx) { fprintf(stderr, "Could not allocate audio/video codec context\n"); return -1; } enc_ctx->bit_rate = bit_rate; enc_ctx->width = width; enc_ctx->height = height; enc_ctx->time_base = {1, frame_rate}; enc_ctx->framerate = {frame_rate, 1}; int ret = avcodec_parameters_from_context(out_stream->codecpar, enc_ctx); if (ret < 0) { fprintf(stderr, "Failed to copy parameters from output Codec Context to output stream codec parameters\n"); return -1; } } ``` 上述片段说明了怎样找到合适的编码器并将选定的参数应用到即将被写入目标位置的数据上。 #### 3. 开始推送数据包至远程服务器 一旦准备就绪,则可以开始循环读取本地资源(如摄像头捕获的画面),将其转换成适合网络传输的形式后发送出去。 ```cpp while (...) { // 获取原始图像帧... // 将其压缩为特定格式... // 创建新的AVPacket实例存储已编码的信息... // 向远端地址发出请求以上传该分组的内容... } // 清理工作... ``` 这段伪代码概括了一个典型的实时串流传送过程中的核心操作序列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值