windows?使用ffmpeg?.a靜態(tài)庫讀取Wav音頻并保存PCM的方法
更新時間:2024年02月28日 09:12:48 作者:qiufeng_xinqing
這篇文章主要介紹了windows?使用ffmpeg?.a靜態(tài)庫讀取Wav音頻并保存PCM,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
ffmpeg讀取Wav音頻并保存PCM(源代碼保存成 c/c++ 文件需要與編譯命令一致):
// test_ffmpeg.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結束。
//
//#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;
}
// 創(chuàng)建輸出文件
FILE* outputFile = fopen("output.pcm", "wb");
AVPacket packet;
printf("start read frame...\n");
while ((ret = av_read_frame(formatCtx, &packet)) == 0) {
// 如果數(shù)據(jù)包是音頻數(shù)據(jù)
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) {
// 處理解碼后的音頻數(shù)據(jù),例如寫入文件等
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 或調試 >“開始執(zhí)行(不調試)”菜單
// 調試程序: F5 或調試 >“開始調試”菜單
// 入門使用技巧:
// 1. 使用解決方案資源管理器窗口添加/管理文件
// 2. 使用團隊資源管理器窗口連接到源代碼管理
// 3. 使用輸出窗口查看生成輸出和其他消息
// 4. 使用錯誤列表窗口查看錯誤
// 5. 轉到“項目”>“添加新項”以創(chuàng)建新的代碼文件,或轉到“項目”>“添加現(xiàn)有項”以將現(xiàn)有代碼文件添加到項目
// 6. 將來,若要再次打開此項目,請轉到“文件”>“打開”>“項目”并選擇 .sln 文件編譯命令:
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 -lshell32 strip -o test_1.exe test_g.exe # 使用upx壓縮應用(需要windows終端執(zhí)行) upx.exe -9 -o test.exe test_1.exe rm -rf test_g.exe test_1.exe ./test.exe
到此這篇關于windows 使用ffmpeg .a靜態(tài)庫讀取Wav音頻并保存PCM的方法的文章就介紹到這了,更多相關windows 使用ffmpeg .a靜態(tài)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++11中l(wèi)onglong超長整型和nullptr初始化空指針
本文介紹?C++11?標準中新添加的?long?long?超長整型和?nullptr?初始化空指針,在?C++11?標準下,相比?NULL?和?0,使用?nullptr?初始化空指針可以令我們編寫的程序更加健壯,本文結合示例代碼給大家詳細講解,需要的朋友跟隨小編一起看看吧2022-12-12
C語言實現(xiàn)手寫Map(數(shù)組+鏈表+紅黑樹)的示例代碼
這篇文章主要為大家詳細介紹了如何利用C語言實現(xiàn)手寫Map(數(shù)組+鏈表+紅黑樹),文中的示例代碼講解詳細,對我們學習有一定借鑒價值,需要的可以參考一下2022-09-09

