web-dev-qa-db-ja.com

ffmpegを使ってビデオを切り取る

このような大きなファイルの一部を切り取るためにffmpegを使用しています。

ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv

-ss部分は正常に機能しますが、-tは無視されます。 -ssで指定された最初の指定された秒を正しく削除しますが、それからコピーを使用して入力の終わりまで進み続けます。

Ffmpegを使用して、ビデオを記録せずにビデオの終わりを切り捨てる方法はありますか。

304
Neil

-ssオプションを使用して開始タイムスタンプを指定し、-tオプションを使用してエンコード期間を指定できます。タイムスタンプはHH:MM:SS.xxx形式または秒数(s.msec)である必要があります。

次の例では、最初の30秒を切り取り、その後10秒後のすべてを切り取ります。

ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv

-tは出力オプションであり、常に の後に -iを指定する必要があることに注意してください。

いくつかのヒント:

  • 古いffmpegバージョンでは、-ssの後に-iを使用すると、実行が遅くなるという犠牲を払ってより正確にシークできます。参照: FFmpegで検索する
  • カットしたいタイムスタンプを指定するために-toの代わりに-tを使うことができます。そのため、-i <input> -ss 30 -t 10の代わりに-i <input> -ss 30 -to 40を実行しても同じことができます。

  • あなたのffmpegが-c、または-toをサポートしていないなら、それはおそらく非常に時代遅れです。 自分で新しいバージョン をコンパイルするか、または 彼らのホームページから静的ビルド をダウンロードしてください。本当に複雑ではありません。

363
user37242

他の人が言ったように、-ss-iの前(はるかに速い)または後(より正確)に置くことは大きな違いを生みます。 ffmpeg seekページの「Fast And Accurate seek」セクションでは、両方を取得する方法を説明しています。私はそれを使用しましたが、大きな違いが出てきます。基本的には-ssの後にANDの前に-iを置くことになります。別のキーフレームを作るためにカットを開始したい場所の前に十分な時間を空けるようにしてください。例:Video.mp4で9分0秒から10分0秒までの1分のクリップを作成したい場合は、次のようにして素早く正確に両方を行うことができます。

ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4

最初の-ssは(およそ)8min0secに高速シークし、次に2番目の-ssは9min0secに正確にシークし、-t 00:01:00は1min0secのクリップを取り出します。

また、このページの重要な点にも注意してください。「-ss-c:v copyと一緒に使用すると、ffmpegはi-onlyで/ splitのみを使用するように強制されるフレーム」

これは、単にコピーしたい場合や、ビデオが途切れて同期がとれなくなった場合でも、ビデオを再エンコードする必要があることを意味します。最初に-c copyを試すこともできますが、ビデオに問題がある場合はやり直す必要があります。

87
seriesoftubes

私は、-ss-c copyを組み合わせると、開始時に半秒のチョップが発生することを発見しました。

それを避けるためには、-c copyを削除する必要があります(これは明らかにトランスコードを行います)。

22
Chris

手動で

コマ送りしてメディアプレーヤーでファイルを開き、次のようなデータでAVISynthファイルを再生します。

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)

それから正確な時間フォーマットで切ります:

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:05.240 -to 00:00:08.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"

そして

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:10.240 -to 00:00:14.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"

次のような内容のビデオファイルを含むtxtファイルを作成します。

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'

Ffmpegを実行します。

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"
14
Budman1

私にとって-tオプションはうまくいきませんでしたが、-vframesはうまくいきました。 #framesを使うほうが好きです、なぜなら私はむしろI-Frameをカットしたいと思い、ffprobeを使ってビデオのGOPを見つけたからです。

私のために働いたコマンドラインは次のとおりです。

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv

ところで、-ssの前に-iを入れると、実行時間が大きく変わります。

9
Ben

User 225366と同様に、-tオプションは短いビデオでは機能しませんが、長いビデオでは機能します。短いビデオでは、-frames:vの方が良いようです。これは私のために働いたものです。

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4

他の答えが示すように、ビデオに音声がある場合は、-acodecコピーを追加する必要があります。

5
VectorVortec