オーディオをトリミングするFFmpegコマンドがあります。
ffmpeg -ss 01:43:46 -t 00:00:44.30 -i input.mp3 output.mp3
このコマンドでの問題は、そのオプション-t
には1:43:46の期間(秒単位)が必要です。開始/停止時間を使用してオーディオをトリミングしたい。 1:43:46と:01:45.02の間。
これは可能ですか?
ffmpegは ドキュメント に新しいオプション-toがあるようです:
-toposition(input/output)
positionで出力の書き込みまたは入力の読み取りを停止します。 positionは継続時間の指定である必要があります。ffmpeg-utils(1)マニュアルの (ffmpeg-utils)Time durationセクションを参照してください。-toと-tは相互に排他的で、-tが優先されます。
2つの時刻形式のサンプルコマンド
ffmpeg -i file.mkv -ss 20 -to 40 -c copy file-2.mkv
ffmpeg -i file.mkv -ss 00:00:20 -to 00:00:40 -c copy file-2.mkv
これにより、20秒のマークから40秒のマークまでのfile.mkvのコピー(file-2.mkv)が作成されます。
PHPがインストールされている場合は、スクリプトにします:
TimeDiff.phpの内容:
<?php
// Create datetime objcects
$dt1 = new DateTime($argv[1]);
$dt2 = new DateTime($argv[2]);
// Conver difference to seconds
$dt3 = $dt2->format('U') - $dt1->format('U');
// echo $dt3."\n";
$h = (int)($dt3 / 3600);
$dt3 %= 3600;
$m = (int)($dt3 / 60);
$dt3 %= 60;
$s = $dt3;
// Dump as H:M:S
echo $h . ":" . $m . ":" . $s;
?>
audiochop.shの内容:
#!/bin/bash
INFILE=$1
START=$2
STOP=$3
OUTFILE=$4
OFFSET=`php TimeDiff.php "$START" "$STOP"`
echo "Disecting $INFILE starting from $START to $STOP (duration $OFFSET)"
ffmpeg -ss "$START" -t "$OFFSET" -i "$INFILE" "$OUTFILE"
使用法:
./audiochop.sh [input.mp3] [startchop] [stopchop] [output.mp3]
ここで、[startchop]と[stopchop]はどちらもトラックの先頭からの絶対タイムスタンプです。
注:プラットフォームのバージョンなどによっては、スクリプトの調整が必要になる場合があります...