ffmpeg での crop、末尾カット、部分カット、にまつわる雑なメモ

まさしく、なう、何度も必要になるのであるからしての「マイ取り急ぎ」んぐメモ。

こんな紹介しといてなんだが剥き身の ffmpeg の話。PyAVでもない。

crop しつつ、「お尻の何秒かはゴミ」(ただしこれは音声なしの例):

1 me@host: ~$ ffmpeg -y -i in.mp4 -vcodec h264 -filter:v "crop=1280:768:0:0" -an -t 00:03:23.000 out.mp4

部分カットは「ダル」かった。一度目の作業ヒストリから「雑なシェルスクリプト」に:

 1 #! /bin/sh
 2 # USAGE:
 3 #   $prog input cut_start_time cut_end_time
 4 #   for example:
 5 #     $prog input.mp4 00:02:14.000 00:02:25.000
 6 
 7 #
 8 input="$1"
 9 cut_s="$2"
10 cut_e="$3"
11 
12 #
13 tmp1=.ffmpgcut$$1.mp4
14 tmp2=.ffmpgcut$$2.mp4
15 tmpL=.ffmpgcut$$CL.txt
16 trap 'rm -fv $tmp1 $tmp2 $tmpL' 0 1 2 3 15
17 #
18 
19 ffmpeg -y -i ${input} -vcodec copy -acodec copy -t ${cut_s} ${tmp1}
20 ffmpeg -y -i ${input} -vcodec copy -acodec copy -ss ${cut_e} ${tmp2}
21 
22 printf "file '%s'\nfile '%s'\n" `pwd -W`/${tmp1} `pwd -W`/${tmp2} > ${tmpL}
23 ffmpeg -y -f concat -safe 0 -i ${tmpL} -c copy ${input}.out.mp4

テンポラリをカレントに置いてるのは「MSYS と Windows ネイティブとの喧嘩」にまつわる問題を回避している。なまじ色気を出して /tmp なんぞに置こうとすると無駄にハマる。まぁここは詳しくは説明しない。あと「pwd -W」が移植性がなくてやぁねぇ。これ、「MSYS な bash 固有」(と思う)で、MSYS なマウントに基づく仮想ではなく実パスを返す。

こんなもんに Python (PyAV も含め) はお呼びでないでしょ、って思ってるわけでもなくて、そうすりゃぁ色々融通が利くかもなぁと思いつつも、「ひとまず本日の、以後何回かの用を足せればいい」ってノリ、今のところ。

ただ今後も何度も必要になる可能性は結構あるんで、必要に感じたら整理するかも。元はと言えば Windows のムービーメーカーでやろうとして、「遅過ぎて、ハングアップもしちゃって、止めることも出来なくて、…」で仕方なく ffmpeg でやろうとしてる。けど「整理されてりゃぁ」ffmpeg なら速いし快適とも言えるわけで。


2018-06-16追記: 部分カットのもちっとよろしい解を書いた