ffmpeg播放器声音效果1-淡入淡出

 直接上播放器:

 

 播放器要求使用类似千千静听的淡入淡出功能,声音的淡入淡出,就是开始声音缓缓变大,不会突然很大。结束的时候声音逐渐放小,不会突然的消失。特别对于某些特别场合特别有用,比如交谊舞,舞台歌曲等音响声音很大的场合切换,有了淡入淡出会非常平滑不会突兀!言归正传,程序实现其实原理也很简单,就是线性控制音乐播放音量大小。刚开始时,比如3秒内,音量从0慢慢增加到100。结束前3秒,音量从100慢慢减少到0.拖动进度时,和开始播放一样的处理方式。OK,直接上核心代码:

void CMP3FenGe::SetFadeIn(  LONG nFadeIn, LONG nFadeInStartTime, LONG nFadeInTime)
{
	m_nFadeIn=nFadeIn;
	m_nFadeInStartTime=nFadeInStartTime;
	m_nFadeInTime=nFadeInTime;

}

void CMP3FenGe::SetFadeOut(  LONG nFadeOut, LONG nFadeOutStartTime, LONG nFadeOutTime)
{
	m_nFadeOut=nFadeOut;
	m_nFadeOutStartTime=nFadeOutStartTime;
	m_nFadeOutTime=nFadeOutTime;
}


声音回调函数调用插入:
		FadeIn((BYTE*)BufLeft,dwRetBytesL);
		FadeOut((BYTE*)BufLeft,dwRetBytesL);

具体实现:
//淡入淡出 0无效果  1淡入
void CMP3FenGe::FadeIn(BYTE *pData,int nLen)
{
	if(m_nFadeIn==0)
		return;
	if(m_nFadeInTime<=100)
		return;
	__int64 nCurTime=this->GetCurMSec();
	if(nCurTime>=m_nFadeInStartTime&&nCurTime<=m_nFadeInStartTime+m_nFadeInTime)
	{
		double dbGain=(double)(nCurTime-m_nFadeInStartTime)/(double)(m_nFadeInTime);
		WaveGain(pData,nLen,dbGain);
		TRACE("fadein gain:%0.2f\n",dbGain);
	
	}

}

//淡入淡出 0无效果  1淡入 2淡出
void CMP3FenGe::FadeOut(BYTE *pData,int nLen)
{
	if(m_nFadeOut==0)
		return;
	if(m_nFadeOutTime<=100)
		return;
	__int64 nCurTime=this->GetCurMSec();
	if(nCurTime>=m_nFadeOutStartTime&&nCurTime<=m_nFadeOutStartTime+m_nFadeOutTime)
	{
		double dbGain=1-(double)(nCurTime-m_nFadeOutStartTime)/(double)(m_nFadeOutTime);
		WaveGain(pData,nLen,dbGain);
		TRACE("fadeout gain:%0.2f\n",dbGain);
	
	}

}


声音增益调整函数:
//调整增益
static void WaveGain(BYTE *pBuf,int nLen,float fGain=3.0f)//16位单声道
{
	short w;
	for(int i=0;i<nLen;i+=2)
	{
		w=MAKEWORD(pBuf[i],pBuf[i+1]);
		int iw=(float)w*fGain;
		if(iw>32767)
			iw=32767;
		if(iw<-32767)
			iw=-32767;
		w =	iw;
		(pBuf)[i]=LOBYTE(w);
		(pBuf)[i+1]=HIBYTE(w);
	}
}

 

 好啦,这篇文档主要就是讲下声音的淡入淡出算法,有时间下篇继续讲下声音的变速不变调和声音的变调处理算法。敬请期待!

可能是1天,可能是1月,可能是1年。。。。。。

什么时候找个时间上传代码上去,最后打个广告:

需要合作的联系QQ35744025,本人03年从事工作(好老),“精通”音视频应用编程技术(勉强加个精通,吸引眼球,哈哈),精通VC,MFC,多媒体教学软件,录播软件,直播软件的核心技术大部分已掌握,如ffmpeg技术,MP4,FLV编码合成,H264,AAC,MP3,可以运用IPP进行高效图像空间转换等,可以运用INTEL和cuda进行硬件H264编解码,可以实现240帧1080P实时编码,完全同步及平滑度极高,rtmp直播推送,rtmp服务器,YV12,YUV422,NV12,RGB24,RGB32熟悉转换,缩放,wav,AAC, mp3的编码解码,视频切换特效算法,视频水印,LOGO,文字。屏幕截取录像,摄像头捕获录像,D3D高效视频图像显示,OPENCV,图像库ximage,GDI,GDIPLUS熟练应用,语音识别及文字转换,人脸识别及匹配,局域网内远程控制,音视频实时通话,声卡捕获回放等,另外SQL数据库,ACCESS,EXCEL数据库,DOC,PDF文件打开提取,FTPServer,Client,以上所有代码均已商用。

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,一直没有仔细统计过,原来我也学会了这么多东西了啊,真佩服自己啊

 

 

### 使用 Python 和 FFmpeg 实现视频合并并添加淡入淡出效果 为了实现视频合并并添加淡入淡出效果,可以通过 `ffmpeg-python` 库来完成这一目标。以下是详细的说明以及代码示例。 #### 安装依赖 首先需要安装 `ffmpeg-python` 库和本地的 FFmpeg 工具。FFmpeg 可以通过包管理器或者官方网站下载安装[^1]。对于 `ffmpeg-python`,可以直接使用 pip 进行安装: ```bash pip install ffmpeg-python ``` #### 合并视频并添加淡入淡出效果 下面是一个完整的代码示例,展示如何使用 `ffmpeg-python` 将两个 MP4 文件合并,并在每个片段之间添加淡入淡出过渡效果。 ```python import ffmpeg def merge_videos_with_fade(input_files, output_file): """ Merge multiple videos with a fade-in/fade-out transition between them. :param input_files: List of input video file paths (e.g., ['video1.mp4', 'video2.mp4']) :param output_file: Output merged video file path (e.g., 'output.mp4') """ # Create an empty filter graph to hold the transitions joined = None first_video = True for i, input_file in enumerate(input_files): stream = ffmpeg.input(input_file) if not first_video: # Add fade-out effect at the end of previous segment prev_stream = ( last_stream.filter('fade', type='out', start_time=duration - 0.5, duration=0.5) ) # Add fade-in effect at the beginning of current segment curr_stream = ( stream.filter('fade', type='in', start_time=0, duration=0.5) ) # Concatenate two streams together combined = ffmpeg.concat(prev_stream, curr_stream, v=1, a=0) joined = ffmpeg.concat(joined, combined, v=1, a=0) if joined else combined else: # For the first video, no need for fade-in since it's the starting point joined = stream # Update variables for next iteration probe = ffmpeg.probe(input_file) duration = float(probe['format']['duration']) # Get video duration last_stream = stream first_video = False # Write final concatenated result to output file output = ffmpeg.output(joined, output_file).overwrite_output() ffmpeg.run(output) if __name__ == "__main__": input_files = ["input1.mp4", "input2.mp4"] # Replace these with your actual files output_file = "merged_output.mp4" merge_videos_with_fade(input_files, output_file) ``` 上述代码实现了以下功能: - 遍历输入文件列表,逐个加载视频流。 - 对于每一段视频,在其结尾处应用 **Fade-Out** 效果[^3]。 - 下一段视频在其开头部分应用 **Fade-In** 效果- 使用 `ffmpeg.concat()` 方法将多个带有过渡效果的视频片段连接起来[^4]。 最终生成的结果保存到指定路径中。 --- #### 注意事项 1. 如果需要处理音频轨道,则需额外配置 `-c:a copy` 或者重新编码音频流[^5]。 2. 确保 FFmpeg 版本支持所需滤镜(如 `fade`),通常最新版本即可满足需求。 3. 输入文件应具有相同的分辨率和帧率;如果同,可能需要先统一预处理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周星星的星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值