ffmpeg volumedetect滤镜获取音量

使用ffmpeg获取音量信息并实现音量检测
该博客介绍了如何通过ffmpeg库中的volumedetect滤镜来获取音频文件的音量信息。作者在C++代码中详细展示了如何初始化、配置和使用ffmpeg,包括读取输入文件、设置过滤器、处理音量数据以及输出到控制台的过程。代码实现了多个线程分别负责读取、音量检测和写入操作。尽管ffmpeg源码中没有直接提供获取音量的接口,但作者通过跟踪源码找到了在文件处理结束时触发音量打印的时机。

ffmpeg中用volumedetect滤镜获取音量,结果是输出到控制台上,本人跟了一下ffmpeg源码,想尝试着看是否有具体的接口来获取音量大小,结果没有,在文件处理完之后,调用avfilter_graph_free时,会触发音量的控制台打印,如下所示:
在这里插入图片描述

代码结构如下:
在这里插入图片描述

其中FfmpegGetVolume.cpp的代码如下:

#include <iostream>
#include "VolumeGet.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
};
#endif




int main()
{
   
   
	CVolumeGet cCVolumeGet;
	const char *pFileA = "E:\\learn\\ffmpeg\\FfmpegFilterTest\\x64\\Release\\huoluan3_audio.mp4";

	const char *pFileOut = "E:\\learn\\ffmpeg\\FfmpegFilterTest\\x64\\Release\\huoluan3_audio_copy.mp4";

	cCVolumeGet.StartVolumeGet(pFileA, pFileOut);
	cCVolumeGet.WaitFinish();

	return 0;
}



VolumeGet.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
};
#endif

class CVolumeGet
{
   
   
public:
	CVolumeGet();
	~CVolumeGet();
public:
	int StartVolumeGet(const char *pFileA, const char *pFileOut);
	int WaitFinish();
private:
	int OpenFileA(const char *pFileA);
	int OpenOutPut(const char *pFileOut);
	int InitFilter(const char* filter_desc);
private:
	static DWORD WINAPI FileAReadProc(LPVOID lpParam);
	void FileARead();


	static DWORD WINAPI VolumeGetProc(LPVOID lpParam);
	void VolumeGet();

	static DWORD WINAPI AudioWriteProc(LPVOID lpParam);
	void AudioWrite();
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;
	AVAudioFifo		*m_pResampleFifo = NULL;
private:
	AVFilterGraph* m_pFilterGraph = NULL;
	AVFilterContext* m_pFilterCtxSrcAudioA = NULL;
	AVFilterContext* m_pFilterCtxSink = NULL;
private:
	CRITICAL_SECTION m_csAudioASection;
	CRITICAL_SECTION m_csResampleSection;
	HANDLE m_hFileAReadThread = NULL;
	HANDLE m_hVolumeGetThread = NULL;
	HANDLE m_hAudioWriteThread = NULL;

	AVRational m_streamTimeBase;
	SwrContext *m_pAudioConvertCtx = NULL;
};






VolumeGet.cpp的代码如下:


#include "VolumeGet.h"
//#include "log/log.h"





CVolumeGet::CVolumeGet()
{
   
   
	InitializeCriticalSection(&m_csAudioASection);
	InitializeCriticalSection(&m_csResampleSection);
}

CVolumeGet::~CVolumeGet()
{
   
   
	DeleteCriticalSection(&m_csAudioASection);
	DeleteCriticalSection(&m_csResampleSection);
}

int CVolumeGet::StartVolumeGet(const char *pFileA, const char *pFileOut)
{
   
   
	int ret = -1;
	do
	{
   
   
		ret = OpenFileA(pFileA);
		if (ret != 0)
		{
   
   
			break;
		}

		ret = OpenOutPut(pFileOut);
		if (ret != 0)
		{
   
   
			break;
		}

		char szFilterDesc[512] = {
   
    0 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值