複数のオーディオファイルがあり、各ファイルから最後の1秒を削除する必要があります。オーディオファイルの長さは任意です。
これを行うための最良のツール/方法は何ですか?
私はffmpegにある程度慣れていますが、私が知っている限り、これを行うための直接的なオプションはありません(-ssと-toを使用して開始時間と終了時間を提供する必要があります)。
答え1
バイパス方法を使用する必要があります。ファイルを2回抽出し、2番目の入力のタイムスタンプをトリミングしたい末尾の期間だけオフセットします。次にsetを使用して、2つのストリームを別のffmpegインスタンスにパイプします-shortest
。 2番目のffmpegインスタンスでは、2番目の入力のストリームのみが保存されます。
ffmpeg -i in.mp3 -itsoffset 1 -i in.mp3 -map 0:a:0 -map 1:a:0 -c copy -shortest -f nut - | ffmpeg -f nut -i - -c copy -map 0:1 out.mp3
答え2
あなたはそれを使用することができますメディア情報持続時間をミリ秒単位で取得し、持続時間 - 1に切り替えます。
duration=$(mediainfo FILE.mp3 --Inform="Audio;%Duration%")
ffmpeg -to $(($duration / 1000 - 1)) -i FILE.mp3 -c copy FILE_NEW.mp3
答え3
このサイトの他の質問に対する回答に触発され、私も何かを作ることができました。コマンドはオプションfind
として渡すことができます。exec
ffmpeg -i FILE1.wma -ss 0 -to $(echo $(ffprobe -i FILE1.wma -show_entries format=duration -v quiet -of csv="p=0") - 1 | bc) -c copy FILE2.wma
中間部分が$(echo $(ffprobe -i FILE1.wma -show_entries format=duration -v quiet -of csv="p=0") - 1 | bc)
必要な期間を最初に取得します。パイプはbc
フローティング形式で計算を実行します。その後、その出力はデフォルトの-to
コマンドに引数として渡されます。
理解を助けるために、上記の長い一行のコマンドを分析しましょう。
ffmpeg -i FILE1.wma -ss 0 -to
$(echo
$(ffprobe -i FILE1.wma -show_entries format=duration -v quiet -of csv="p=0")
- 1 | bc
)
-c copy FILE2.wma