FFmpegエンコーディングを一時停止および再開する方法はありますか?


13

私は毎日数時間のビデオ映像を記録し、それをエンコードのためにキューに設定しましたffmpegveryslowプリセットをx265で使用するため、1時間のビデオでエンコードするのに最大20時間以上かかる場合があります。

私のコンピューターは昼夜を問わず稼働しているので、エンコードffmpeg一時停止して再開する方法があるのだろうか?TerminalOS Xに使用しています。

その場合、ターミナルをシャットダウンしてコンピューターを再起動した後でもエンコードを続行できますか?OS Xに再度ログインすると、ターミナルセッションが復元されると思います。少なくともターミナルの履歴は復元されます。

回答:


14

サスペンド

簡単な方法は、ctrl+で一時停止することzです。または、PIDを取得し、pgrep ffmpegそれを使用kill -s SIGSTOP <PID>して中断します。

次に、fgコマンドまたはで再開しkill -s SIGCONT <PID>ます。

残念ながら、これは再起動後は存続しません。

VM

VirtualBoxなどの仮想マシンを使用する場合、ゲストVMでエンコードを実行できます。リブート後もいつでも「マシンの状態を保存」できます。また、ゲストに最大CPUリソースを割り当てて、ホストが常に使用可能なリソースを持つようにすることもできます。

おそらくやり過ぎかもしれませんが、VMに精通している場合、または既にVMを使用している場合は、可能な解決策です。


ただし、VMソリューションを使用している場合を除き、このVMソリューションは非常に面倒です。
-user24601

VirtualBoxの方法はうまくいきませんでした。エンコード中に状態を保存するだけで、[Ctrl] + [z]で一時停止してから状態を保存しようとしました。状態を復元して再開しようとffmpegすると、エラー(decode_band_types: Input buffer exhausted before END element foundまたはInvalid NAL unit sizeand Error writing trailer/ Protocol error)で停止します。多分それは時間のジャンプに関連している、私は知らない。
ジャニスエルメリス

@JānisElmerisその問題を再現することはできません。Ubuntu 18.04 VMで試してみましたが、うまくいきました。
llogan

OK、私はおそらく十分に幸運ではありません。:)新しいLinux Mint 19.1(Ubuntu 18.04ベース)VirtualBox VMで試してみました。
ジャニスエルメリス

私のffmpegには、多くのthredと同じ数のPIDがあります。それぞれをSIGSTOPとSIGCONTする必要がありますか?タイムリーな制約はありますか?
wuppi

10

2015年9月30日の時点では不可能でした。ソースファイルをセグメント化し、セグメントをエンコードしてから、結果のファイルをステッチすることをお勧めします。

これは真の一時停止/再開機能ではありませんが、断片的な区分により、エンコードを中断できます。

発行するコマンドの大まかな概要:

フルファイルをパーツに分割する

ffmpeg -i recording.mp4 -c copy -flags +global_header -segment_time n -f segment file%03d.mp4

これにより、file000.mp4、file001.mp4などが作成されます。セグメンターの動作方法(Iフレームでのカットのみ)のため、これらのファイルのn長さは正確には数秒でなく、ビデオ部分は正しく再生されない場合がありますが、データはすべて揃っており、各部分を変換できます

ffmpeg -i file001.mp4 -{filter/encoding parameters} -fflags +genpts file001-new.mp4

エンコードされた部分を再結合します

テキストファイルを作成し、このようにレンダリングされた各ファイルの名前を入力します

file 'file000-new.mp4'
file 'file001-new.mp4'
.... 
file 'filelast-new.mp4'

そして走る

ffmpeg -f concat -i textfile -c copy -fflags +genpts recording-encoded.mp4

6GBのメモリしかなく、x264からx265に変換する推定時間は12時間で、ノーブレーク(デスクトップ)はありませんが、VMトリックは使用できませんが、これはすばらしいですね!再結合のステップは速いと思っていますが、エンコードが行われないため、そうなると思います。試してみてください、thx vm!
アクエリアスパワー

参加するときには、警告を作成します:「ストリーム0のためのコーデックがグローバルヘッダーを使用しませんが、コンテナフォーマットはグローバルヘッダを必要とし、」しかし、最終的な結果は、使用可能なビデオです、私はまったく問題を見ていない
アクエリアスパワー

10

Windowsでは、「Pause / Break」キー(右上のキー)を押すと一時停止します。Enterが再開します。

動作しない場合は、コマンドプロンプトウィンドウをクリックしてフォーカスを合わせます。


これは、Windowsで最も簡単で最良の回答です(Windows 10で検証済み)。
リドシンカー

1
これによりCPUが完全に解放されますが、RAMは依然としてボトルネックになっています。私の場合、8GBのRAMがあり、操作が一時停止している間もほぼすべてを使用しています。その修正はありますか?これをhddなどに転送できますか?一時停止を解除するときに物事が始まるのを少し気にしません。
カイト

4

一時停止するのではなく、エンコードプロセスのシステム優先度(「renice」とも呼ばれる)を最も低くするため、毎日快適に作業でき、未使用のシステムリソースを使用してエンコードがバックグラウンドで実行されます。エンコードは、24時間年中無休でシームレスに行われ、日中の作業と競合することはありません

AFAIK OSXにはpidofコマンドがないため、ffmpegプロセス番号(PID)を知る必要があります。

その後、プロセスをバックグラウンドでアイドル状態に戻すことができます

sudo renice 20 yourPID

必要に応じて、より積極的なフォアグラウンド優先度にプロセスを放棄することもできます

sudo renice -10 yourPID

こんにちは!良い提案。それを試さなければなりません。
Winterflags


1

(これはLinuxの場合)

ご存知のように、「q」を押すと記録ファイルが終了します。

ffplayには「p」の可能性があります。ffmpegに同じものがないのはなぜですか?おそらく、ビデオとオーディオの間で非同期が発生する可能性があるためですか?...

私はちょうどcrf(23)でx264-aac-mkvにffmpeg-encodeし、常に同じビデオ条件で、記録を「終了」(q)し、このスクリプトが存在する特定のディレクトリのすべてのセグメントを1ファイルに結合しますこのbashスクリプトを使用したスト​​リームコピーモード:

#!/bin/bash

# FFMPEG MERGE

# File path must be absolutely absolute...

ffmpeg -f concat -safe 0 -i <(printf "file '%s'\n" /home/me/Videos/FFmpeg/FFmpeg_Merge/*.mkv) -c copy merged.mkv

exit 

その後、結果のマージされたビデオを確認し、別のディレクトリに貼り付けます。セグメントはマージディレクトリから削除されます。

しかし、面倒な「一時停止と再開」ボタンは本当に歓迎されます;)


0

これは単なるアイデアですが、予算がある場合は、エンコードできるように、プロセッサ(第8世代Intel)またはビデオカード(NVIDIA GTX 1050以上)をアップグレードすることをお勧めします。 CPUを集中的に使用する代わりに、ハードウェアアクセラレーションを備えたh.265 / HEVC x265。ビデオのエンコードは20時間未満で完了し、電気代も節約できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.