FFMPEG命令以可调节的音量混合音频和视频

问题描述 投票:0回答:1

我有:

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

我正在尝试获得具有以下品质的输出视频:

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

我不太了解FFMPEG,也许有些专家可以提供帮助。

audio video ffmpeg android-ffmpeg
1个回答
0
投票

因为您正在使用库,所以我假设您知道如何运行纯FFmpeg命令

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

即使输入的视频没有音频也不会中断

为了解决这种情况,您可以在运行任何带有以下代码的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;
}

因此,如果以上功能的结果等于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

在以上命令中,我们在特定路径上获取音频文件

  • 循环= 0,无限循环音频
  • asetpts = N / SR / TB,通过计数样本生成时间戳记
  • 音量= 2.0,音频音量乘以2.0

视频的音频流可通过[0:a]滤板访问,因此我们将其设为输入音量的一半,并将其命名为[sa],如果您想将其静音,您将源视频的音频更改为:

[0:a]volume=0.0[sa]

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

  • -vcodec libx264,我们使用x264视频编码,因为它具有许多配置以获得更好的性能和速度
  • -最短,因为我们无限循环音频,所以我们告诉ffmpeg继续创建帧,直到最短的流结束(视频流肯定是最短的流)]
  • -preset ultrafast,预设是x264选项之一,ultrafast将以输出文件更大的尺寸为您提供更高的编码速度,通常对此标志使用veryfast值是一个很好的组合速度和大小,以下是此标志的可用值

如果isVideoContainAudioStream函数最后返回false(这意味着您的输入视频已静音),则可以在以下命令中运行:

ffmpeg -i mute_video.mp4 -filter_complex "amovie=/Users/rasool/Desktop/Temp/audio.mp3:loop=0,asetpts=N/SR/TB,volume=0.5[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编码器有很多选项,您可以在此链接上检查所有可用的选项:

H.264 Video Encoding Guide

© www.soinside.com 2019 - 2024. All rights reserved.