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 }
使用ffmpeg获取音量信息并实现音量检测

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

被折叠的 条评论
为什么被折叠?



