本文将从音视频mp4文件中提取对应的音频数据,并写入文件。
本人以霍乱时期的爱情电影为题材,提取里面的音频;整个mp4文件为1.69G大小,时长两个小时12分41秒,提取的音频数据生成的音频文件的大小为123兆,时长两个小时12分41秒。

注意,本人只提取了一路音频,不涉及mp4里面多路音频的情况。

提取过程也简单,就不说明了。

代码结构如下:

其中main函数所在文件FfmpegExtractAudio内容如下:

#include <iostream>
#include "ExtractAudio.h"
#include <vector>#ifdef   __cplusplus
extern "C"
{#endif#pragma comment(lib, "avcodec.lib")
#pragma comment(lib, "avformat.lib")
#pragma comment(lib, "avutil.lib")
#pragma comment(lib, "avdevice.lib")
#pragma comment(lib, "avfilter.lib")
#pragma comment(lib, "postproc.lib")
#pragma comment(lib, "swresample.lib")
#pragma comment(lib, "swscale.lib")#ifdef __cplusplus
};
#endifint main()
{CExtractAudio cCExtractAudio;const char *pFileA = "E:\\ffmpeg\\convert\\huoluan.mp4";const char *pFileOut = "E:\\learn\\ffmpeg\\FfmpegGifTest\\x64\\Release\\huoluan3_audio_extract.mp4";cCExtractAudio.StartExtractAudio(pFileA, pFileOut);cCExtractAudio.WaitFinish();return 0;
}

ExtractAudio.h的内容如下:

#pragma once#include <Windows.h>#ifdef __cplusplus
extern "C"
{#endif
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libswresample/swresample.h"
#include "libavdevice/avdevice.h"
#include "libavutil/audio_fifo.h"
#include "libavutil/avutil.h"
#include "libavutil/fifo.h"
#include "libavutil/frame.h"
#include "libavutil/imgutils.h"#include "libavfilter/avfilter.h"
#include "libavfilter/buffersink.h"
#include "libavfilter/buffersrc.h"#ifdef __cplusplus
};
#endifclass CExtractAudio
{public:CExtractAudio();~CExtractAudio();
public:int StartExtractAudio(const char *pFileA, const char *pFileOut);int WaitFinish();
private:int OpenFileA(const char *pFileA);int OpenOutPut(const char *pFileOut);
private:static DWORD WINAPI FileAReadProc(LPVOID lpParam);void FileARead();static DWORD WINAPI ExtractAudioProc(LPVOID lpParam);void ExtractAudio();
private:AVFormatContext *m_pFormatCtx_FileA = NULL;AVCodecContext *m_pReadCodecCtx_AudioA = NULL;AVCodec *m_pReadCodec_AudioA = NULL;AVCodecContext  *m_pCodecEncodeCtx_Audio = NULL;AVFormatContext *m_pFormatCtx_Out = NULL;AVAudioFifo      *m_pAudioAFifo = NULL;
private:CRITICAL_SECTION m_csAudioASection;HANDLE m_hFileAReadThread = NULL;HANDLE m_hExtractAudioThread = NULL;AVRational m_streamTimeBase;SwrContext *m_pAudioConvertCtx = NULL;int m_iAudioStreamIndex = 0;
};

ExtractAudio.cpp的内容如下:


#include "ExtractAudio.h"
//#include "log/log.h"CExtractAudio::CExtractAudio()
{InitializeCriticalSection(&m_csAudioASection);
}CExtractAudio::~CExtractAudio()
{DeleteCriticalSection(&m_csAudioASection);
}int CExtractAudio::StartExtractAudio(const char *pFileA, const char *pFileOut)
{int ret = -1;do{ret = OpenFileA(pFileA);if (ret != 0){break;}ret = OpenOutPut(pFileOut);if (ret != 0){break;}m_pAudioAFifo = av_audio_fifo_alloc((AVSampleFormat)m_pFormatCtx_FileA->streams[m_iAudioStreamIndex]->codecpar->format,m_pFormatCtx_FileA->streams[m_iAudioStreamIndex]->codecpar->channels, 3000 * 1024);int iSrcChLayout = m_pFormatCtx_FileA->streams[m_iAudioStreamIndex]->codecpar->channel_layout;int iDstChLayout = m_pFormatCtx_Out->streams[0]->codecpar->channel_layout;int iSrcSampleRate = m_pFormatCtx_FileA->streams[m_iAudioStreamIndex]->codecpar->sample_rate;int iDstSampleRate = m_pFormatCtx_Out->streams[0]->codecpar->sample_rate;int iSrcFmt = m_pFormatCtx_FileA->streams[m_iAudioStreamIndex]->codecpar->format;int iDstFmt = m_pFormatCtx_Out->streams[0]->codecpar->format;m_pAudioConvertCtx = swr_alloc();av_opt_set_channel_layout(m_pAudioConvertCtx, "in_channel_layout", iSrcChLayout, 0);av_opt_set_channel_layout(m_pAudioConvertCtx, "out_channel_layout", iDstChLayout, 0);av_opt_set_int(m_pAudioConvertCtx, "in_sample_rate", iSrcSampleRate, 0);av_opt_set_int(m_pAudioConvertCtx, "out_sample_rate", iDstSampleRate, 0);av_opt_set_sample_fmt(m_pAudioConvertCtx, "in_sample_fmt", (AVSampleFormat)iSrcFmt, 0);av_opt_set_sample_fmt(m_pAudioConvertCtx, "out_sample_fmt", (AVSampleFormat)iDstFmt, 0);ret = swr_init(m_pAudioConvertCtx);m_hFileAReadThread = CreateThread(NULL, 0, FileAReadProc, this, 0, NULL);m_hExtractAudioThread = CreateThread(NULL, 0, ExtractAudioProc, this, 0, NULL);} while (0);return ret;
}int CExtractAudio::WaitFinish()
{int ret = 0;do{if (NULL == m_hFileAReadThread){break;}WaitForSingleObject(m_hFileAReadThread, INFINITE);CloseHandle(m_hFileAReadThread);m_hFileAReadThread = NULL;WaitForSingleObject(m_hExtractAudioThread, INFINITE);CloseHandle(m_hExtractAudioThread);m_hExtractAudioThread = NULL;} while (0);return ret;
}int CExtractAudio::OpenFileA(const char *pFileA)
{int ret = -1;do{if ((ret = avformat_open_input(&m_pFormatCtx_FileA, pFileA, 0, 0)) < 0) {printf("Could not open input file.\n");break;}if ((ret = avformat_find_stream_info(m_pFormatCtx_FileA, 0)) < 0) {printf("Failed to retrieve input stream information\n");break;}for (int i = 0; i < m_pFormatCtx_FileA->nb_streams; i++){if (m_pFormatCtx_FileA->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO){m_streamTimeBase = m_pFormatCtx_FileA->streams[i]->time_base;m_pReadCodec_AudioA = (AVCodec *)avcodec_find_decoder(m_pFormatCtx_FileA->streams[i]->codecpar->codec_id);m_pReadCodecCtx_AudioA = avcodec_alloc_context3(m_pReadCodec_AudioA);if (m_pReadCodecCtx_AudioA == NULL){break;}avcodec_parameters_to_context(m_pReadCodecCtx_AudioA, m_pFormatCtx_FileA->streams[i]->codecpar);if (avcodec_open2(m_pReadCodecCtx_AudioA, m_pReadCodec_AudioA, NULL) < 0){break;}m_iAudioStreamIndex = i;ret = 0;break;}}} while (0);return ret;
}int CExtractAudio::OpenOutPut(const char *pFileOut)
{int iRet = -1;AVStream *pAudioStream = NULL;do{avformat_alloc_output_context2(&m_pFormatCtx_Out, NULL, NULL, pFileOut);{AVCodec* pCodecEncode_Audio = (AVCodec *)avcodec_find_encoder(m_pFormatCtx_Out->oformat->audio_codec);m_pCodecEncodeCtx_Audio = avcodec_alloc_context3(pCodecEncode_Audio);if (!m_pCodecEncodeCtx_Audio){break;}pAudioStream = avformat_new_stream(m_pFormatCtx_Out, pCodecEncode_Audio);if (!pAudioStream){break;}m_pCodecEncodeCtx_Audio->sample_rate = m_pReadCodecCtx_AudioA->sample_rate;m_pCodecEncodeCtx_Audio->channel_layout = m_pReadCodecCtx_AudioA->channel_layout;m_pCodecEncodeCtx_Audio->channels = av_get_channel_layout_nb_channels(m_pCodecEncodeCtx_Audio->channel_layout);m_pCodecEncodeCtx_Audio->sample_fmt = (AVSampleFormat)m_pReadCodecCtx_AudioA->sample_fmt;if (m_pFormatCtx_Out->oformat->flags & AVFMT_GLOBALHEADER)m_pCodecEncodeCtx_Audio->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;if (avcodec_open2(m_pCodecEncodeCtx_Audio, pCodecEncode_Audio, 0) < 0){//编码器打开失败,退出程序break;}}if (!(m_pFormatCtx_Out->oformat->flags & AVFMT_NOFILE)){if (avio_open(&m_pFormatCtx_Out->pb, pFileOut, AVIO_FLAG_WRITE) < 0){break;}}avcodec_parameters_from_context(pAudioStream->codecpar, m_pCodecEncodeCtx_Audio);if (avformat_write_header(m_pFormatCtx_Out, NULL) < 0){break;}iRet = 0;} while (0);if (iRet != 0){if (m_pCodecEncodeCtx_Audio != NULL){avcodec_free_context(&m_pCodecEncodeCtx_Audio);m_pCodecEncodeCtx_Audio = NULL;}if (m_pFormatCtx_Out != NULL){avformat_free_context(m_pFormatCtx_Out);m_pFormatCtx_Out = NULL;}}return iRet;
}DWORD WINAPI CExtractAudio::FileAReadProc(LPVOID lpParam)
{CExtractAudio *pExtractAudio = (CExtractAudio *)lpParam;if (pExtractAudio != NULL){pExtractAudio->FileARead();}return 0;
}void CExtractAudio::FileARead()
{AVFrame *pFrame;pFrame = av_frame_alloc();AVPacket packet = { 0 };int ret = 0;while (1){av_packet_unref(&packet);ret = av_read_frame(m_pFormatCtx_FileA, &packet);if (ret == AVERROR(EAGAIN)){continue;}else if (ret == AVERROR_EOF){break;}else if (ret < 0){break;}if (packet.stream_index != m_iAudioStreamIndex){continue;}ret = avcodec_send_packet(m_pReadCodecCtx_AudioA, &packet);if (ret >= 0){ret = avcodec_receive_frame(m_pReadCodecCtx_AudioA, pFrame);if (ret == AVERROR(EAGAIN)){continue;}else if (ret == AVERROR_EOF){break;}else if (ret < 0) {break;}while (1){int buf_space = av_audio_fifo_space(m_pAudioAFifo);if (buf_space >= pFrame->nb_samples){EnterCriticalSection(&m_csAudioASection);ret = av_audio_fifo_write(m_pAudioAFifo, (void **)pFrame->data, pFrame->nb_samples);LeaveCriticalSection(&m_csAudioASection);break;}else{Sleep(100);}}}if (ret == AVERROR(EAGAIN)){continue;}}av_frame_free(&pFrame);
}DWORD WINAPI CExtractAudio::ExtractAudioProc(LPVOID lpParam)
{CExtractAudio *pExtractAudio = (CExtractAudio *)lpParam;if (pExtractAudio != NULL){pExtractAudio->ExtractAudio();}return 0;
}void CExtractAudio::ExtractAudio()
{int ret = 0;AVFrame *pFrameAudioA = av_frame_alloc();pFrameAudioA->nb_samples = m_pFormatCtx_FileA->streams[m_iAudioStreamIndex]->codecpar->frame_size > 0 ? m_pFormatCtx_FileA->streams[m_iAudioStreamIndex]->codecpar->frame_size : 1024;pFrameAudioA->channel_layout = m_pFormatCtx_FileA->streams[m_iAudioStreamIndex]->codecpar->channel_layout;pFrameAudioA->format = m_pFormatCtx_FileA->streams[m_iAudioStreamIndex]->codecpar->format;pFrameAudioA->sample_rate = m_pFormatCtx_FileA->streams[m_iAudioStreamIndex]->codecpar->sample_rate;pFrameAudioA->channels = m_pFormatCtx_FileA->streams[m_iAudioStreamIndex]->codecpar->channels;av_frame_get_buffer(pFrameAudioA, 0);AVPacket packet = { 0 };int iAudioFrameIndex = 0;while (1){if (NULL == m_pAudioAFifo){break;}if (av_audio_fifo_size(m_pAudioAFifo) >=(m_pFormatCtx_Out->streams[0]->codecpar->frame_size > 0 ? m_pFormatCtx_Out->streams[0]->codecpar->frame_size : 1024)){EnterCriticalSection(&m_csAudioASection);int readcount = av_audio_fifo_read(m_pAudioAFifo, (void **)pFrameAudioA->data,(m_pFormatCtx_FileA->streams[m_iAudioStreamIndex]->codecpar->frame_size > 0 ? m_pFormatCtx_FileA->streams[m_iAudioStreamIndex]->codecpar->frame_size : 1024));LeaveCriticalSection(&m_csAudioASection);ret = avcodec_send_frame(m_pCodecEncodeCtx_Audio, pFrameAudioA);if (ret == AVERROR(EAGAIN)){continue;}ret = avcodec_receive_packet(m_pCodecEncodeCtx_Audio, &packet);if (ret == AVERROR(EAGAIN)){continue;}packet.stream_index = 0;packet.pts = iAudioFrameIndex * m_pFormatCtx_Out->streams[0]->codecpar->frame_size;packet.dts = iAudioFrameIndex * m_pFormatCtx_Out->streams[0]->codecpar->frame_size;packet.duration = m_pFormatCtx_Out->streams[0]->codecpar->frame_size;ret = av_write_frame(m_pFormatCtx_Out, &packet);iAudioFrameIndex++;}else{if (m_hFileAReadThread == NULL){break;}Sleep(1);}}av_write_trailer(m_pFormatCtx_Out);avio_close(m_pFormatCtx_Out->pb);av_frame_free(&pFrameAudioA);
}

ffmpeg从视频文件中提取音频数据相关推荐

  1. 使用ffmpeg从视频文件中提取音频文件、视频抽帧和切割视频

    目录 ffmpeg下载 使用ffmpeg从视频文件中提取音频文件 批量提取文件夹下多个视频文件的音频 使用ffmpeg从视频文件中提取视频帧 使用ffmpeg将按固定时长将视频切割成多个小片段 将分割 ...

  2. [SimplePlayer] 4. 从视频文件中提取音频

    提取音频,具体点来说就是提取音频帧.提取方法与从视频文件中提取图像的方法基本一样,这里仅列出其中的不同点: 1. 由于目的提取音频,因此在demux的时候需要指定的是提取audio stream Au ...

  3. Python从视频文件中提取音频

    利用python库moviepy或者ffmpeg处理 # 这是一个示例 Python 脚本. from moviepy.editor import * import tkinter as tk fro ...

  4. 【Android】使用MediaExtractor、MediaMuxer去掉视频文件中的音频数据

    1 简介 本文以 mp4 文件为例,讲解去音频操作.mp4 是一种视频封装的容器,里面包含音频(audio)和视频(video)数据,对应的数据编码格式分别为 aac 和 h264.在去音频过程中,主 ...

  5. python提取视频中的音频 代码_如何使用python从视频文件中提取音频?

    I want to write a python program that could extract audio from a video file (e.g. video.avi). Is the ...

  6. FFmpeg进阶: 转码输出视频文件中的音频

    很多时候为了方便收听视频文件中的音频信息,我们会将视频文件中的音频流转码输出成音频文件,方便在对应的平台上进行播放.这里就介绍一下如何通过FFmpeg将视频文件中的音频流转码成特定编码格式的音频文件. ...

  7. 从flv文件中提取音频并存储为mp3格式

    在优酷上下载了一些教学视频,为了把它们放到mp3里面,需要从这些flv文件中提取出音频数据并存储为mp3格式. 操作系统是centos 5.3. 在网上搜索了一下,找到以下方法: 方法一:使用menc ...

  8. python音频 降噪_从视频中提取音频数据,然后应用傅里叶对音频降噪(python)...

    视频准备 QQ有热键 然后随便打开一个视频网站进行录屏 我选择B站 从视频中提取音频 需要安装包moviepy pip install moviepy 提取代码 from moviepy.editor ...

  9. 从视频中提取音频数据,然后应用傅里叶对音频降噪(python)

    视频准备 QQ有热键 然后随便打开一个视频网站进行录屏 我选择B站 从视频中提取音频 需要安装包moviepy pip install moviepy 提取代码 from moviepy.editor ...

  10. [SimplePlayer] 1. 从视频文件中提取图像

    在开始之前,我们需要了解视频文件的格式.视频文件的格式众多,无法三言两语就能详细分析其结构,尽管如此,ffmpeg却很好地提取了各类视频文件的共同特性,并对其进行了抽象描述. 视频文件格式,统称为co ...

最新文章

  1. 年薪75万的真实技术面试实践攻略(篇章二)
  2. Google AI 又来放大招,放射科医生会被取代吗?
  3. Selenium2+python自动化46-js解决click失效问题
  4. [转] Web前端优化之 内容篇
  5. POJ1003/1004/1005/1207/3299/2159/1083/3094/2388解题(刷一波水题)
  6. cmos存储器中存放了_天津大学姚建铨院士,张雅婷副教授JMCC:具有宽光谱调控特性的阻变存储器...
  7. C# 连蒙带骗不知所以然的搞定USB下位机读写
  8. rpcbind 、nfs无法启动问题
  9. 山西好点的计算机专科学校排名及分数线,2019山西十大专科学校排名及高考录取分数线...
  10. chemdraw怎么连接两个结构_ChemDraw如何连接两个片段?
  11. 兼容所有浏览器的网页播放器
  12. 单身的我写了一个七夕表白程序
  13. 问题 G: 结义兄弟
  14. eclipse 插件教程_编写Eclipse插件教程–第1部分
  15. VS2017 生成DLL 供python 调用
  16. 【详解】标识符命名规则及命名规范
  17. KERNEL32相关函数
  18. Windows Server 2012中修改光驱盘符
  19. css 水平垂直居中的几种常见方式
  20. ai2022中文版(支持m1) v26.0.3中文版

热门文章

  1. 数据库编程(常量与变量+常用系统函数)
  2. 51单片机系列--led点阵屏显示汉字
  3. 排错-通过LLDP信息查找环路(以H3C S5100为例)
  4. 学习(四):显示FPS,和自定义显示调试
  5. 【IoT】产品设计:包装盒LOGO设计工艺
  6. WEB基础之:创建表格
  7. HTML5背景颜色表格作业,HTML快速入门5——不规则表格、表格背景、边框颜色
  8. 【React】【Ant Deign】手机验证码登录效果实现
  9. gif一键抠图 在线_高效抠图PS竟全然不是对手?堪称黑科技的AI一键抠图网站
  10. sci一区二区 SCI、EI、ISTP分别指什么