FFMPEG命令混合音频和视频,音量可调
FFMPEG command to mix audio and video with adjustable volume
我有:
- X长度的视频文件
- Y 长度的音频
我正在努力实现具有以下品质的输出视频:
- 添加音频的音量应该是可调的
- 音频应该循环播放到视频结束
- 即使输入视频没有任何音频也不应该中断
- 如果需要,我应该能够将源视频的音频静音。
- 以上所有,以最快的方式进行。
我对 FFMPEG 不太熟悉,也许一些专家可以提供帮助。
由于您使用的是库,因此我假设您知道如何 运行 纯 FFmpeg 命令
根据您的第三个条件,我们将解决方案分为两部分:
It should not break even if the input video does not have any audio
为了解决这种情况,您可以在使用以下代码运行使用任何 FFmpeg 命令之前检查您的视频文件中是否有任何音频流:
private boolean isVideoContainAudioStream(String videoPath) {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(videoPath);
String hasAudioStream = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_AUDIO);
if (hasAudioStream != null && hasAudioStream.equals("yes"))
return true;
else
return false;
}
1.第一部分 :
因此,如果上述函数的结果等于 true,则您的视频文件包含音频流,因此您可以 运行 下面的命令:
ffmpeg -i video.mp4 -filter_complex "amovie=/path/to/audio/file/audio.mp3:loop=0,asetpts=N/SR/TB,volume=2.0[audio];[0:a]volume=0.5[sa];[sa][audio]amix[fa]" -map 0:v -map [fa] -vcodec libx264 -preset ultrafast -shortest fout.mp4
在上面的命令中,我们使用 amovie 过滤器
在特定路径获取音频文件
- loop=0,无限循环音频
- asetpts=N/SR/TB,通过统计样本生成时间戳
- volume=2.0,将音频音量乘以 2.0
视频的音频流可通过 [0:a] 过滤垫访问,因此我们将其音量设置为输入音量的一半并将其命名为 [sa] 显然,如果您想将源视频的音频静音,您可以将该部分更改为:
[0:a]volume=0.0[sa]
之后我们将使用 amix 过滤器混合两个音频流并将其命名为 [fa],到目前为止我们已经拥有了我们想要的一切, 我们只想合并音频和视频流
- -vcodec libx264,我们使用 x264 视频编码,因为它有很多配置以获得更好的性能和速度
- -最短,因为我们无限循环音频,我们告诉 ffmpeg 继续创建帧,直到最短的流结束(视频流肯定是最短的)
- -preset ultrafast,preset 是 x264 选项之一,ultrafast 会以更大的输出文件大小为代价提供更快的编码速度,通常使用 veryfast 此标志的值是速度和大小的良好组合
2。第二部分:
如果 isVideoContainAudioStream 函数 return 为假(这意味着您的输入视频被静音),您可以 运行 下面的命令:
ffmpeg -i mute_video.mp4 -filter_complex "amovie=/path/to/audio/file/audio.mp3:loop=0,asetpts=N/SR/TB,volume=2.0[audio]" -map 0:v -map [audio] -vcodec libx264 -preset ultrafast -crf 18 -shortest m_fout.mp4
在上面的命令中,我们使用了另一个名为 CRF
的 x264 选项
恒定速率因子 (CRF)
如果您想保持最佳质量并且不太关心文件大小,请使用此速率控制模式。这是大多数用途的推荐速率控制模式。
CRF 等级的范围是 0–51,其中 0 是无损的,23 是默认值,51 是可能的最差质量。较低的值通常会导致较高的质量,主观上理智的范围是 17-28。将 17 或 18 视为视觉无损或接近无损;它应该看起来与输入相同或几乎相同,但它在技术上不是无损的。
范围是指数级的,因此将 CRF 值增加 +6 会导致大约一半的比特率/文件大小,而 -6 会导致大约两倍的比特率。
选择仍能提供可接受质量的最高 CRF 值。如果输出看起来不错,则尝试更高的值。如果看起来不好,请选择较低的值。
就是这样,x264 编码器有很多选项,您可以在此 link:
查看所有可用选项
我有:
- X长度的视频文件
- Y 长度的音频
我正在努力实现具有以下品质的输出视频:
- 添加音频的音量应该是可调的
- 音频应该循环播放到视频结束
- 即使输入视频没有任何音频也不应该中断
- 如果需要,我应该能够将源视频的音频静音。
- 以上所有,以最快的方式进行。
我对 FFMPEG 不太熟悉,也许一些专家可以提供帮助。
由于您使用的是库,因此我假设您知道如何 运行 纯 FFmpeg 命令
根据您的第三个条件,我们将解决方案分为两部分:
It should not break even if the input video does not have any audio
为了解决这种情况,您可以在使用以下代码运行使用任何 FFmpeg 命令之前检查您的视频文件中是否有任何音频流:
private boolean isVideoContainAudioStream(String videoPath) {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(videoPath);
String hasAudioStream = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_AUDIO);
if (hasAudioStream != null && hasAudioStream.equals("yes"))
return true;
else
return false;
}
1.第一部分 :
因此,如果上述函数的结果等于 true,则您的视频文件包含音频流,因此您可以 运行 下面的命令:
ffmpeg -i video.mp4 -filter_complex "amovie=/path/to/audio/file/audio.mp3:loop=0,asetpts=N/SR/TB,volume=2.0[audio];[0:a]volume=0.5[sa];[sa][audio]amix[fa]" -map 0:v -map [fa] -vcodec libx264 -preset ultrafast -shortest fout.mp4
在上面的命令中,我们使用 amovie 过滤器
在特定路径获取音频文件- loop=0,无限循环音频
- asetpts=N/SR/TB,通过统计样本生成时间戳
- volume=2.0,将音频音量乘以 2.0
视频的音频流可通过 [0:a] 过滤垫访问,因此我们将其音量设置为输入音量的一半并将其命名为 [sa] 显然,如果您想将源视频的音频静音,您可以将该部分更改为:
[0:a]volume=0.0[sa]
之后我们将使用 amix 过滤器混合两个音频流并将其命名为 [fa],到目前为止我们已经拥有了我们想要的一切, 我们只想合并音频和视频流
- -vcodec libx264,我们使用 x264 视频编码,因为它有很多配置以获得更好的性能和速度
- -最短,因为我们无限循环音频,我们告诉 ffmpeg 继续创建帧,直到最短的流结束(视频流肯定是最短的)
- -preset ultrafast,preset 是 x264 选项之一,ultrafast 会以更大的输出文件大小为代价提供更快的编码速度,通常使用 veryfast 此标志的值是速度和大小的良好组合
2。第二部分:
如果 isVideoContainAudioStream 函数 return 为假(这意味着您的输入视频被静音),您可以 运行 下面的命令:
ffmpeg -i mute_video.mp4 -filter_complex "amovie=/path/to/audio/file/audio.mp3:loop=0,asetpts=N/SR/TB,volume=2.0[audio]" -map 0:v -map [audio] -vcodec libx264 -preset ultrafast -crf 18 -shortest m_fout.mp4
在上面的命令中,我们使用了另一个名为 CRF
的 x264 选项恒定速率因子 (CRF)
如果您想保持最佳质量并且不太关心文件大小,请使用此速率控制模式。这是大多数用途的推荐速率控制模式。
CRF 等级的范围是 0–51,其中 0 是无损的,23 是默认值,51 是可能的最差质量。较低的值通常会导致较高的质量,主观上理智的范围是 17-28。将 17 或 18 视为视觉无损或接近无损;它应该看起来与输入相同或几乎相同,但它在技术上不是无损的。
范围是指数级的,因此将 CRF 值增加 +6 会导致大约一半的比特率/文件大小,而 -6 会导致大约两倍的比特率。
选择仍能提供可接受质量的最高 CRF 值。如果输出看起来不错,则尝试更高的值。如果看起来不好,请选择较低的值。
就是这样,x264 编码器有很多选项,您可以在此 link:
查看所有可用选项