windows?使用ffmpeg?.a靜態庫讀取Wav音頻并保存PCM的方法

windows?使用ffmpeg?.a靜態庫讀取Wav音頻并保存PCM的方法

本文將為您詳細介紹如何在windows系統中利用ffmpeg的.a靜態庫讀取WAV音頻文件并將其保存為PCM數據。希望通過本文的講解,您能掌握這項實用技能。

在Windows中使用FFmpeg .a靜態庫讀取WAV音頻并保存為PCM

引言

本指南旨在詳細說明如何在Windows環境中利用FFmpeg的.a靜態庫,從WAV音頻文件中讀取數據并將其轉換并保存為PCM格式。我們將從設置開發環境開始,逐步講解到代碼編寫和程序執行的全過程。

準備工作

  1. 安裝FFmpeg:從官方網站下載并安裝適合Windows的FFmpeg版本。
  2. 獲取FFmpeg .a靜態庫:從FFmpeg官方網站下載對應的.a靜態庫文件。
  3. 安裝visual studio使用Visual Studio作為C/c++的編譯器和ide。

設置開發環境

  1. 創建項目:在Visual Studio中新建一個C/C++控制臺應用程序項目。
  2. 添加庫路徑:在“附加包含目錄”中添加FFmpeg庫的路徑。
  3. 鏈接庫文件:在“附加依賴項”中添加FFmpeg的.a靜態庫文件。

代碼示例

#include <stdio.h> #include <stdlib.h> #include <libavformat/avformat.h> <p>int main() { // 定義輸入和輸出文件 const char<em> inputFile = "input.wav"; const char</em> outputFile = "output.pcm";</p><pre class="brush:php;toolbar:false">// 打開輸入文件 AVFormatContext* inputContext = NULL; if (avformat_open_input(&inputContext, inputFile, NULL, NULL) != 0) {     fprintf(stderr, "無法打開輸入文件n");     return -1; }  // 查找音頻流 AVStream* audioStream = NULL; for (int i = 0; i < inputContext->nb_streams; i++) {     if (inputContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {         audioStream = inputContext->streams[i];         break;     } }  // 打開輸出文件 AVFormatContext* outputContext = NULL; if (avformat_alloc_output_context2(&outputContext, NULL, NULL, outputFile) != 0) {     fprintf(stderr, "無法分配輸出上下文n");     avformat_close_input(&inputContext);     return -1; }  // 添加音頻流到輸出上下文 AVStream* outputAudioStream = NULL; outputAudioStream = avformat_new_stream(outputContext, NULL); if (outputAudioStream == NULL) {     fprintf(stderr, "無法添加音頻流到輸出上下文n");     avformat_close_input(&inputContext);     avformat_free_context(outputContext);     return -1; }  // 初始化編碼器 AVCodecContext* outputCodecContext = NULL; outputCodecContext = outputAudioStream->codec; outputCodecContext->codec_id = AV_CODEC_ID_PCM_S16LE; outputCodecContext->sample_rate = audioStream->codecpar->sample_rate; outputCodecContext->channels = audioStream->codecpar->channels; outputCodecContext->sample_fmt = AV_SAMPLE_FMT_S16; if (avcodec_open2(outputCodecContext, NULL, NULL) != 0) {     fprintf(stderr, "無法初始化編碼器n");     avformat_close_input(&inputContext);     avformat_free_context(outputContext);     return -1; }  // 讀取和寫入數據 int packetIndex = 0; AVPacket* inputPacket = av_packet_alloc(); while (av_read_frame(inputContext, inputPacket) >= 0) {     if (inputPacket->stream_index == audioStream->index) {         AVPacket* outputPacket = av_packet_alloc();         if (avcodec_send_packet(outputCodecContext, inputPacket) == 0) {             if (avcodec_receive_packet(outputCodecContext, outputPacket) == 0) {                 if (av_write_frame(outputContext, outputPacket) == 0) {                     packetIndex++;                 }                 av_packet_free(&outputPacket);             }         }     }     av_packet_unref(inputPacket); } av_packet_free(&inputPacket);  // 關閉文件和清理資源 avcodec_close(outputCodecContext); avformat_close_input(&inputContext); avio_closep(&outputContext->pb); avformat_free_context(outputContext);  printf("成功處理 %d 個數據包n", packetIndex); return 0;

}

編譯與執行

  1. 編譯代碼:使用Visual Studio編譯上述源代碼。
  2. 運行程序:執行編譯后的可執行文件。

結果

該程序將會成功地從WAV音頻文件中讀取數據,并將PCM數據保存到指定的輸出文件中。

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享