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,以上所有代码均已商用。

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

 

 

### 使用 FFmpeg 实现视频或音频淡入淡出效果 FFmpeg 提供了 `fade` 滤镜用于实现视频和音频淡入淡出效果。以下是具体方法及相关参数说明: #### 参数详解 - **type (t)**: 指定淡入 (`in`) 或淡出 (`out`) 的类型[^1]。 - **start_frame (s)**: 设定效果开始的帧号。默认为 0。 - **nb_frames (n)**: 效果持续的帧数。对于淡入,表示从指定帧到结束逐渐显示原视频;对于淡出,表示从指定帧到结束逐渐变为背景颜色。 - **alpha**: 若设为 1,则仅影响透明通道(需支持 Alpha 通道)。默认为 0[^1]。 - **start_time (st)**: 按秒设定效果开始的时间戳。若同时设置了 `start_frame` 和 `start_time`,则取较晚发生的一个作为起始时间[^1]。 - **duration (d)**: 按秒设定效果持续时间。优先级高于 `nb_frames`[^1]。 - **color (c)**: 淡化后的颜色(适用于淡出),默认为黑色 ("black")[^1]。 #### 视频淡入淡出示例 以下是一些常见的命令行示例: ##### 单独处理视频部分 - **从第 30 帧开始淡入** ```bash ffmpeg -i input.mp4 -vf "fade=t=in:s=0:n=30" output.mp4 ``` - **在最后一段 25 帧淡出** 假设总帧数为 1000: ```bash ffmpeg -i input.mp4 -vf "fade=t=out:s=975:n=25" output.mp4 ``` - **先设置黑屏 5 秒再淡入** ```bash ffmpeg -f lavfi -i color=c=black:s=1920x1080:r=30:d=5 -i input.mp4 \ -filter_complex "[1:v][0:v]overlay,fade=t=in:st=5:d=0.5[v]" \ -map "[v]" -map 1:a output.mp4 ``` #### 音频淡入淡出示例 除了视频滤镜外,还可以通过 `afade` 滤镜单独控制音频淡入淡出效果- **音频前 5 秒淡入** ```bash ffmpeg -i input.mp4 -af "afade=t=in:ss=0:d=5" output.mp4 ``` - **音频最后 10 秒淡出** ```bash ffmpeg -i input.mp4 -af "afade=t=out:st=$(ffprobe -i input.mp4 -show_entries format=duration -of compact=p=0:nk=1 -v 0)-10:d=10" output.mp4 ``` 注意:以上命令中的 `$()` 是 Shell 脚本语法,用于动态计算文件长度减去 10 秒的位置。 #### 同时处理音视频 可以组合使用 `-filter_complex` 来同时对音视频施加淡入淡出效果- **视频前 5 秒淡入,音频10 秒淡入** ```bash ffmpeg -i input.mp4 -filter_complex "[0:v]fade=t=in:st=0:d=5[v];[0:a]afade=t=in:ss=0:d=10[a]" -map "[v]" -map "[a]" output.mp4 ``` - **视频最后 5 秒淡出音频最后 10 秒淡出** ```bash ffmpeg -i input.mp4 -filter_complex "[0:v]fade=t=out:st=$(ffprobe -i input.mp4 -show_entries format=duration -of compact=p=0:nk=1 -v 0)-5:d=5[v];[0:a]afade=t=out:st=$(ffprobe -i input.mp4 -show_entries format=duration -of compact=p=0:nk=1 -v 0)-10:d=10[a]" -map "[v]" -map "[a]" output.mp4 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

周星星的星

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

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

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

打赏作者

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

抵扣说明:

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

余额充值