繁体   English   中英

FFMPEG 命令混合音频和视频,音量可调

[英]FFMPEG command to mix audio and video with adjustable volume

我有:

  • X长度的视频文件
  • Y长度的音频

我正在尝试实现具有以下品质的 output 视频:

  1. 添加音频的音量级别应该是可调的
  2. 音频应该循环到视频结束
  3. 即使输入视频没有任何音频,它也不应该中断
  4. 如果需要,我应该能够将源视频的音频静音。
  5. 以上所有,以最快的方式。

我不太熟悉 FFMPEG,也许一些专家可以提供帮助。

由于您使用的是库,我假设您知道如何运行纯 FFmpeg 命令

根据您的第三个条件,我们将解决方案分为两部分:

即使输入视频没有任何音频,它也不应该中断

为了解决这种情况,您可以在使用以下代码运行任何 FFmpeg 命令之前检查视频文件中是否有任何音频 stream:

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. 第一部分:

因此,如果上述 function 的结果等于 true,则您的视频文件包含音频 stream,因此您可以运行以下命令:

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,通过计数样本生成时间戳
  • 音量=2.0,将音量乘以 2.0

视频的音频 stream 可通过[0:a]过滤器访问,因此我们将其设置为输入音量的一半并将其命名为[sa]

[0:a]volume=0.0[sa]

之后,我们将使用amix过滤器混合两个音频流并将其命名为[fa] ,到目前为止我们拥有我们想要的一切,我们只想合并音频和视频流

  • -vcodec libx264,我们使用 x264 视频编码,因为它有很多配置来获得更好的性能和速度
  • -最短,因为我们无限循环音频,我们告诉 ffmpeg 继续创建帧,直到最短的 stream 结束(视频 stream 肯定是最短的)
  • -preset ultrafast,preset 是 x264 选项之一, ultrafast将以更大的 output 文件大小为代价为您提供更快的编码速度,通常使用该标志的veryfast值是速度和大小的良好组合

2. 第二部分:

如果isVideoContainAudioStream function 返回 false (这意味着您的输入视频已静音),您可以运行以下命令:

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 值。 如果 output 看起来不错,那么尝试更高的值。 如果看起来不好,请选择较低的值。

就是这样,x264 编码器有很多选项,您可以在此链接中查看所有可用选项:

H.264 视频编码指南

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM