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

标签 audio video ffmpeg android-ffmpeg

我有:

  • 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
    

    在上面的命令中,我们使用 在特定路径获取音频文件电影筛选
  • loop=0,无限循环播放音频
  • asetpts=N/SR/TB,通过计数样本生成时间戳
  • 音量=2.0,将音量乘以 2.0

  • 视频的音频流可通过 访问[0:a] 过滤垫,因此我们将其设置为输入音量的一半并将其命名为 [萨] 显然,如果您想使源视频的音频静音,您可以将该部分更改为:
    [0:a]volume=0.0[sa]
    

    之后,我们将使用 混合两个音频流混合过滤并命名 [发] ,到目前为止,我们拥有了我们想要的一切,我们只想合并音频和视频流
  • -vcodec libx264,我们使用 x264 视频编码,因为它有很多配置来获得更好的性能和速度
  • -最短,因为我们无限循环音频,我们告诉 ffmpeg 继续创建帧,直到最短的流结束(视频流肯定是短的)
  • -preset 超快,preset 是 x264 选项之一,超快将以更大的输出文件大小为代价提供更快的编码速度,通常使用 非常快此标志的值是速度和大小的良好组合

  • 2. 第二部分:

    如果 isVideoContainAudioStream 函数返回 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
    

    在上面的命令中,我们使用另一个名为 的 x264 选项CRF

    恒定速率因子 (CRF)

    如果您想保持最佳质量并且不太关心文件大小,请使用此速率控制模式。这是大多数用途的推荐速率控制模式。

    CRF 的范围是 0-51,其中 0 是无损的,23 是默认值,51 是可能的最差质量。较低的值通常会导致更高的质量,主观上合理的范围是 17-28。考虑 17 或 18 在视觉上无损或几乎无损;它应该看起来与输入相同或几乎相同,但它在技术上不是无损的。

    该范围是指数的,因此增加 CRF 值 +6 会导致大约一半的比特率/文件大小,而 -6 会导致大约两倍的比特率。

    选择仍能提供可接受质量的最高 CRF 值。如果输出看起来不错,则尝试更高的值。如果看起来不好,请选择较低的值。

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

    H.264 Video Encoding Guide

    关于audio - FFMPEG 命令以可调节音量混合音频和视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61716269/

    相关文章:

    nginx - 使用 ffmpeg 和 nginx-rtmp 模块将 H264 流转码为 mpeg2

    ffmpeg - Manim 错误 : It's a sound problem that I haven't seen anywhere else

    php - Windows下PHP中使用ffmpeg

    java - Java 是否足够快以进行实时屏幕共享?

    iphone - 多任务处理 : Stop Background Audio at Specific Time

    c# - 计算两个时间跨度DSP之间的差

    Android Notification Builder 不播放自定义声音

    windows-phone-7 - 如何简单地在 wp7 中发出声音或蜂鸣声?

    iphone - 视频格式、AVFoundation 和 UTI

    php - FFMPEG 输出为 mov 输入视频的 Mp4 视频