windows vs2019 开发 使用ffmpeg 完整教程和示例

1丶下载
选择
Shared 和 Dev版本
windows官方下载地址

2丶移动解压文件
打开项目主目录
1丶把 Shared 里面 bin 里面的dll文件拷贝到项目主目录
2丶Dev 里面的include和lib目录放入主目录
目录结构如下
windows vs2019 开发 使用ffmpeg 完整教程和示例_第1张图片
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;
}

效果如下
windows vs2019 开发 使用ffmpeg 完整教程和示例_第2张图片
这时候成功把a.mp4的音频数据抽取写入到a.acc文件

你可能感兴趣的:(音视频开发,ffmpeg)