当前位置: 首页 > news >正文

windows 使用ffmpeg .a静态库:读取Wav音频并保存PCM

ffmpeg读取Wav音频并保存PCM(源代码保存成 c 文件):

// test_ffmpeg.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
////#include <iostream>#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
//#pragma comment(lib, "libavdevice.a")
//#pragma comment(lib, "libavformat.a")
//#pragma comment(lib, "libavutil.a")
//#pragma comment(lib, "libavcodec.a")
//#pragma comment(lib, "libavfilter.a")
//#pragma comment(lib, "libswresample.a")
//#pragma comment(lib, "libswscale.a")int main(int arvc, char*argv[]) {//av_register_all();printf("start...\n");AVFormatContext* formatCtx = NULL;const AVInputFormat* inputFmt = av_find_input_format(arvc > 1 ? argv[1] : "FLAC");int ret = 0;printf("format name: %s, long name; %s\n", inputFmt->name, inputFmt->long_name);// 打开输入流if ((ret = avformat_open_input(&formatCtx, "D:\\project\\ffmpeg-6.1.1\\test_in.wav", inputFmt, NULL)) != 0) {printf("Unable to open input stream: %s\n", av_err2str(ret));return -1;}// 查找音频流信息if (avformat_find_stream_info(formatCtx, NULL) < 0) {printf("Unable to find audio stream information: %s\n", av_err2str(ret));return -1;}// 寻找第一个音频流索引int audioStreamIndex = av_find_best_stream(formatCtx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);if (audioStreamIndex < 0) {printf("Unable to find audio stream: %s\n", av_err2str(ret));return -1;}//const AVCodecContext* codecCtx = formatCtx->streams[audioStreamIndex]->codec;AVCodecContext* pCodecCtx = avcodec_alloc_context3(NULL);if (pCodecCtx == NULL){printf("Could not allocate AVCodecContext: %s\n", av_err2str(ret));return -1;}avcodec_parameters_to_context(pCodecCtx, formatCtx->streams[audioStreamIndex]->codecpar);// 打开解码器const AVCodec* codec = avcodec_find_decoder(pCodecCtx->codec_id);if (avcodec_open2(pCodecCtx, codec, NULL) < 0) {printf("Unable to open decoder: %s\n", av_err2str(ret));return -1;}// 创建输出文件FILE* outputFile = fopen("output.pcm", "wb");AVPacket packet;printf("start read frame...\n");while ((ret = av_read_frame(formatCtx, &packet)) == 0) {// 如果数据包是音频数据if (packet.stream_index == audioStreamIndex) {AVFrame* frame = av_frame_alloc();int gotFrame = 0;printf("read frame...index %d\n", audioStreamIndex);// 解码音频帧//avcodec_decode_audio4(pCodecCtx, frame, &gotFrame, &packet);if (avcodec_send_packet(pCodecCtx, &packet) < 0|| (gotFrame = avcodec_receive_frame(pCodecCtx, frame)) < 0) {return -1;}printf("read frame...gotFrame = %d, frame size %d, frame pointer 0x%x\n", (ret), frame->linesize[0], frame->data[0]);if (gotFrame == 0) {// 处理解码后的音频数据,例如写入文件等fwrite(frame->data[0], 1, frame->linesize[0], outputFile);}av_frame_free(&frame);}//av_free_packet(&packet);av_packet_unref(&packet);}printf("read frame end. ret = %s\n", av_err2str(ret));fclose(outputFile);avformat_close_input(&formatCtx);return 0;
}// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

编译命令(使用windows 下的 MSYS2 UCRT64 工具):

gcc -c test.c -o test.o -I./ffmpeg-bin/include gcc -Llibavcodec -Llibavdevice -Llibavfilter -Llibavformat -Llibavutil -Llibpostproc -Llibswscale -Llibswresample -Wl,--nxcompat,--dynamicbase -Wl,--high-entropy-va -Wl,--as-needed -Wl,--warn-common -Wl,-rpath-link=:libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil  -Wl,--image-base,0x140000000 -o test_g test.o -lavdevice -lavfilter -lavformat -lavcodec -lswresample -lswscale -lavutil  -lpsapi -lole32 -lstrmiids -luuid -loleaut32 -lshlwapi -lgdi32 -lm -latomic -lvfw32 -lm -latomic -lm -latomic -lz -lsecur32 -lws2_32 -liconv -lm -latomic -lmfuuid -lole32 -lstrmiids -lole32 -luser32 -lz -lm -latomic -lm -latomic -lm -luser32 -lbcrypt -latomic  -lole32 -lpsapi -lshell32strip -o test_1.exe test_g.exe# 使用upx压缩应用(需要windows终端执行)
upx.exe -9 -o test.exe test_1.exerm -rf test_g.exe test_1.exe./test.exe

http://www.lryc.cn/news/309369.html

相关文章:

  • Docker部署ZooKeeper
  • 在PyCharm中使用Git
  • 【JavaSE】 P165 ~ P194 抽象方法,抽象类,接口,接口内容,多接口实现和父类继承,多态,向上转型,向下转型
  • LeetCode: 数组中的第K个最大元素
  • 亚马逊自养号测评:如何安全搭建环境,有效规避风险
  • uniApp 调整小程序 单个/全部界面横屏展示效果
  • 【java】18:内部类(2)匿名内部类
  • c语言之字符串的输入和输出
  • 戏说c第二十六篇: 测试完备性衡量(代码覆盖率)
  • C语言初阶—函数
  • vue3的router
  • 云时代【5】—— LXC 与 容器
  • npm digital envelope routines::unsupported
  • 深入理解Flutter中的StreamSubscription和StreamController
  • 聊聊 HTTP 性能优化
  • 六、防御保护---防火墙内容安全篇
  • HC32F460 是否有 RTC?在电池供电方案中该如何使用?
  • HTML---表单验证
  • 基于tomcat的JavaWeb实现
  • AI时代编程新宠!如何让孩子成为未来的编程大师?
  • Qt 中Json的构造和解析简单例子
  • CSS特性
  • springcloud:3.1介绍雪崩和Resilience4j
  • 实现定时器的两种方法:使用windows api定时器 和使用c++11/14 定时器
  • H5:图像标签和路径
  • AI学习(5):PyTorch-核心模块(Autograd):自动求导
  • Grid-Based Continuous Normal Representation for Anomaly Detection 论文阅读
  • FaceBook获取广告数据
  • Redis之十:Spring Data Redis --- CrudRepository方式
  • Spring重点记录