1丶下载
选择
Shared 和 Dev版本
windows官方下载地址
2丶移动解压文件
打开项目主目录
1丶把 Shared 里面 bin 里面的dll文件拷贝到项目主目录
2丶Dev 里面的include和lib目录放入主目录
目录结构如下
3丶配置环境,
打开vscode2019
添加头文件路径
项目-属性-配置属性 - c/c++ -常规 -附加包含目录-编辑
然后选择 主目录/include
添加lib路径
项目-属性-配置属性-链接器-常规-附加库目录-编辑
然后选择 主目录/lib
使用ffmpeg api注意
环境配置好了,代码使用需要注意
头文件引入,先要用 #pragma comment 声明链接库,不然会报错。
然后开启在 项目-属性-配置属性 - c/c++ -常规 -sdl检查 改为否
extern "C" {
#pragma comment (lib, "avcodec.lib")
#pragma comment (lib, "avdevice.lib")
#pragma comment (lib, "avfilter.lib")
#pragma comment (lib, "avformat.lib")
#pragma comment (lib, "avutil.lib")
#pragma comment (lib, "swresample.lib")
#pragma comment (lib, "swscale.lib")
}
这是完整的一个示例, 从mp4抽取acc音频数据
大部分代码来自于我的 从mp4抽取acc
#include
extern "C" {
#pragma comment (lib, "avcodec.lib")
#pragma comment (lib, "avdevice.lib")
#pragma comment (lib, "avfilter.lib")
#pragma comment (lib, "avformat.lib")
#pragma comment (lib, "avutil.lib")
#pragma comment (lib, "swresample.lib")
#pragma comment (lib, "swscale.lib")
#include
#include
#include
}
av_always_inline char* wrap_av_err2str(int errnum)
{
static char str[AV_ERROR_MAX_STRING_SIZE];
memset(str, 0, sizeof(str));
return av_make_error_string(str, AV_ERROR_MAX_STRING_SIZE, errnum);
}
int main()
{
int ret = 0;
int jumpNumber = 0;
AVPacket pkt;
char* src = (char*)"C:/Users/shinelon/Desktop/a.mp4";
char* dst = (char*)"C:/Users/shinelon/Desktop/a.acc";
int audio_index, len;
FILE* dst_fd = NULL;
AVFormatContext* fmt_ctx = NULL;
av_log_set_level(AV_LOG_INFO);
av_register_all();
//read stream
std::cout << "将要打开的文件:" << src << ",输出的文件:" << dst << " \n";
ret = avformat_open_input(&fmt_ctx, src, NULL, NULL);//参数为上下文 文件路 径 文件格式 命令行参数
if (ret < 0) {
jumpNumber = -2;
goto __END;
}
fopen_s(&dst_fd,dst,"wb");
if (!dst_fd)
{
jumpNumber = -3;
goto __END;
}
av_dump_format(fmt_ctx, 0, src, 0);
//getStream 得到流地址
ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);
if (ret < 0) {
jumpNumber = -4;
goto __END;
}
//获取数据包
audio_index = ret;
av_init_packet(&pkt);
while (av_read_frame(fmt_ctx, &pkt) >= 0) {
if (pkt.stream_index == audio_index) {//pkt就是数据包对象。
len = fwrite(pkt.data, 1, pkt.size, dst_fd);
if (len != pkt.size) {
jumpNumber = -5;
av_log(NULL, AV_LOG_WARNING, "warning ,length of data isn't equal size of pkt \n");
}
}
av_packet_unref(&pkt);//释放空间i
}
__END:
switch (jumpNumber) {
case -1:
av_log(NULL, AV_LOG_ERROR, "input params error\n"); break;
case -2:
av_log(NULL, AV_LOG_ERROR, "Can't open file: %s \n", wrap_av_err2str(ret)); break;
case -3:
av_log(NULL, AV_LOG_ERROR, "Can't open out file \n"); break;
case -4:
av_log(NULL, AV_LOG_ERROR, "can't find the best stream: %s \n",wrap_av_err2str(ret)); break;
}
try {//释放内存
avformat_close_input(&fmt_ctx);
fclose(dst_fd);
}
catch (...) {}
return ret;
}