0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

HIITのためのBGMをFFmpegコマンドだけでで作成する

Last updated at Posted at 2023-11-03

HIITとは

例えばこんな感じ

  • 20秒運動して10秒休むという運動方法
  • 10秒休むことで継続できる
  • 10秒休むことで20秒は全力で運動できる
  • 8セットやっても4分で終わる
  • だから毎日継続できる

HIITのためのBGMに求められること

  • 20秒もそこそこつらい
  • あと何秒かがわかると嬉しい
  • リズムをキープしたいので1秒ごとに音はなって欲しい
  • 映像で見せるタイプのタイマーもあるが、プランクの姿勢もあるので音だけでわかるようにしたい

DTMツールではなくFFmpegで実装したい

なぜFFmpegか

  • オープンソースであるためコンパイルさえ通ればずっと使える
  • CLIであるため自動化が可能
    • 自動化が可能ということはWebサービスにしやすい
    • Webサービスにしないまでも、bashスクリプトにすることで、コピペ修正で亜種が作りやすい
  • ブラウザ+JavaScriptでメトロノーム的な動きもできなくはないが、テンポがどうしてもずれるので断念
  • 音声ファイルを生成することで、音声プレーヤーや動画プレーヤー側の機能で速度を変えたりできる

まずはFFmpegで自力で音を作るお勉強

# このバージョンでやっています
ffmpeg --version
#=> ffmpeg version 4.2.7-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers

# 試しに1000Hzの音を5秒ならす
ffmpeg -f lavfi -i "sine=frequency=1000:duration=5" 1000hz5sec.wav

# 1000 Hz を0.1秒短く鳴らす
ffmpeg -f lavfi -i "sine=frequency=1000:duration=0.1" 1000hz100msec.wav

# 音を低めにして500 Hz を0.1秒ならす
ffmpeg -f lavfi -i "sine=frequency=500:duration=0.1" 500hz100msec.wav

# 500 Hz を0.1秒で音を慣らして、全体が1秒になるように無音をPaddingする
# 参考 https://nico-lab.net/apad_with_ffmpeg/
ffmpeg -f lavfi  -i "sine=frequency=500:duration=0.1"  -af "apad=whole_dur=1" 500hz100msecpadding.wav

ここから本物を作ってみる

  • 基本は低めの音 500Hz100msec.wav
  • 5秒前に高めの音 1000Hz100msec.wav
  • タイムアップで長めの音 1000Hz1000msec.wav

すべて1秒のwaveファイルを作る

ffmpeg -f lavfi  -i "sine=frequency=500:duration=0.1"  -af "apad=whole_dur=1" 500hz100msec.wav
ffmpeg -f lavfi  -i "sine=frequency=1000:duration=0.1"  -af "apad=whole_dur=1" 1000Hz100msec.wav
ffmpeg -f lavfi  -i "sine=frequency=1000:duration=1"   1000Hz1000msec.wav

次にできたファイルを結合する。

# これをffmpegのファイル結合機能で結合する
# 毎度のことながら、ファイル結合のリストってフルパスでないと駄目なの?
cat myfile.txt
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/1000Hz100msec.wav'
#=> file '/root/work/memo/1000Hz100msec.wav'
#=> file '/root/work/memo/1000Hz100msec.wav'
#=> file '/root/work/memo/1000Hz100msec.wav'
#=> file '/root/work/memo/1000Hz1000msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/1000Hz100msec.wav'
#=> file '/root/work/memo/1000Hz100msec.wav'
#=> file '/root/work/memo/1000Hz100msec.wav'
#=> file '/root/work/memo/1000Hz100msec.wav'
#=> file '/root/work/memo/1000Hz1000msec.wav'


# これで1秒おきにピッとなる音声ファイルの完成
ffmpeg -f concat -safe 0 -i myfile.txt -c copy hiit.wav

アップロードしやすいようにwavをmp4に変換。動画ファイルに変換するには

理想のwaveができたから、あとはwav→mp3に変換していつでも聞けるようにしておきたい。
waveファイル無理やり動画に変換する。映像はないので黒背景の動画に変換。

ffmpeg -f lavfi -i color=c=black:s=1280x720:r=5 -i hiit.wav -s 1980x1080 -c:a aac -b:a 128k -t 30.0 hiit.mp4

完成品をTwitterにアップした
https://twitter.com/yugo_yamamoto/status/1720424805537886320

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?