将一段音频和一张静态图片一起转换成视频并分享至 YouTube 的经验

Posted by Frank Lin on Mon, Jul 3, 2017

最近不时需要实现这样一种需求:将一段 .wav 格式的录音,配一张静止画面(内容为几行文字),做成一个视频并上传 YouTube。要求整个过程中尽量不损失音频质量。

经实践发现一种简单有效的方案,现记录如下:

  1. 通过 Google Slides 制作静态画面。Google Slides 允许将单张幻灯片导出为 .png 格式的图片。

    注意:导出前需将幻灯片尺寸设置为“Custom 1280×720”,否则默认生成的图片尺寸为 960×540,这样制成的视频是不会被 Youtube 标记为“HD”的。

  2. 安装 ffmpeg。在 Mac 上,最简单的方式是通过 Homebrew,有现成配方。其他平台安装方法从略。

    1$ brew install ffmpeg
    2$ ffmpeg -version
    3ffmpeg version 3.3.2 Copyright © 2000-2017 the FFmpeg developers
    4built with Apple LLVM version 8.1.0 (clang-802.0.42)
    5(下略)
    
  3. 生成包含原始音频的 .flv 文件。

    1$ ffmpeg -r 1 -loop 1 -i cover.png -i audio.wav -acodec copy -r 1 -shortest output.flv
    

    注意这个命令中,各参数的顺序不能变。

    • 前一个 -r 1 表示输入为每秒 1 帧。 -loop 1 表示无限循环。然后 -i cover.png 是输入的图片文件。
    • 接着是输入的音频文件 -i audio.wav,-acodec copy 表示不对音频进行转码,即保留原始 Wave 格式。
    • 后一个 -r 1 表示输出也为每秒 1 帧。 -shortest 保证了生成的视频与音频等长(因为视频是无限循环的)。
    • 最后是输出文件名。

    之所以选择生成 .flv 而非 .mp4 文件是因为(似乎)只有 .flv 支持 Wave 格式的音频;使用 .mp4 会报错,必须使用某种 codec 将音频编码。

  4. 将生成的 output.flv 上传 Youtube。Youtube 会自动选择合适的编码方案将音频重新编码,由于上传的是原始 Wave 文件,避免了二次编码造成信息进一步损失。