Apakah ada cara untuk menjeda dan melanjutkan pengkodean FFmpeg?

14

Saya merekam beberapa jam rekaman video setiap hari, yang saya atur dalam antrian untuk penyandian ffmpeg. Saya menggunakan veryslowpreset dengan x265, jadi satu jam video dapat memakan waktu hingga 20 jam atau lebih untuk menyandikan.

Karena komputer saya bekerja siang dan malam, saya bertanya-tanya apakah ffmpegada cara untuk menjeda dan melanjutkan pengkodean? Saya menggunakan Terminaluntuk OS X.

Jika demikian, dapatkah saya juga melanjutkan penyandian bahkan setelah mematikan Terminal dan me-reboot komputer? Saya pikir sesi Terminal dipulihkan ketika Anda login lagi di OS X, setidaknya sejarah Terminal.

Bendera musim dingin
sumber

Jawaban:

14

Menangguhkan

Metode sederhana adalah menangguhkannya dengan ctrl+ z. Atau Anda bisa mendapatkan PID dengan pgrep ffmpegkemudian gunakan kill -s SIGSTOP <PID>untuk menangguhkan.

Kemudian lanjutkan dengan fgperintah atau kill -s SIGCONT <PID>.

Sayangnya ini tidak akan selamat dari reboot.

VM

Jika Anda menggunakan mesin virtual, dengan sesuatu seperti VirtualBox, Anda bisa melakukan pengkodean dalam VM tamu. Ini akan memungkinkan Anda untuk "menyimpan status mesin" kapan saja yang dapat selamat dari reboot. Itu juga dapat memungkinkan Anda untuk menetapkan sumber daya CPU maksimum untuk tamu sehingga tuan rumah Anda akan selalu memiliki sumber daya yang tersedia.

Mungkin berlebihan, tetapi jika Anda terbiasa dengan VM atau sudah menggunakan itu adalah solusi yang mungkin.

llogan
sumber
Saya suka solusi VM, namun, kecuali Anda sudah menggunakannya, ini adalah masalah yang cukup besar.
user24601
Cara VirtualBox tidak berhasil untuk saya. Mencoba hanya untuk menyimpan status di mid-encoding, dan mencoba untuk menangguhkan oleh [Ctrl] + [z] dan kemudian menyimpan status. Setelah memulihkan keadaan dan mencoba melanjutkan, ffmpegberhenti dengan kesalahan ( decode_band_types: Input buffer exhausted before END element foundatau Invalid NAL unit sizedan Error writing trailer/ Protocol error). Mungkin ini terkait dengan lompatan waktu, saya tidak tahu.
Jānis Elmeris
@ JānisElmeris Sepertinya saya tidak bisa menduplikasi masalah itu. Saya mencobanya di Ubuntu 18.04 VM dan berhasil.
llogan
Oke, saya mungkin tidak cukup beruntung. :) Mencoba dengan Linux Mint 19.1 yang baru (berdasarkan Ubuntu 18.04) VirtualBox VM.
Jānis Elmeris
ffmpeg saya memiliki banyak threds dan sebanyak PID. Apakah saya harus SIGSTOP dan SIGCONT masing-masing? apakah ada kendala tepat waktu?
wuppi
11

Pada Windows, menekan tombol "Jeda / Istirahat" (tombol paling kanan atas) akan menjeda itu. Enter akan dilanjutkan.

Jika tidak berhasil, klik pada jendela prompt perintah untuk memberikan fokus.

Buckee
sumber
Ini adalah jawaban termudah dan terbaik untuk Windows (diverifikasi pada Windows 10).
lidsinker
1
Ini membebaskan CPU sepenuhnya tetapi ram masih macet. Dalam kasus saya, saya punya ram 8GB dan masih menggunakan hampir semuanya saat operasi dihentikan sementara. Adakah perbaikan untuk itu? Bisakah saya mentransfer ini ke hdd atau sesuatu? Saya tidak keberatan sedikit angin untuk hal-hal untuk pergi ketika saya berhenti.
Layang
10

Tampaknya tidak mungkin pada 30 Sep 2015 . Saya akan menyarankan segmentasi file sumber, pengkodean segmen dan kemudian menjahit file yang dihasilkan.

Ini bukan fasilitas jeda / resume yang sebenarnya, tetapi divisi sedikit demi sedikit akan memungkinkan Anda untuk tidak melakukan encoding.

Gambaran umum kasar perintah yang akan dikeluarkan:

Memecah file penuh menjadi beberapa bagian

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

Ini harus membuat file000.mp4, file001.mp4 dan seterusnya. Karena cara kerja segmenter - hanya memotong pada I-frames - file-file ini tidak akan nberdurasi tepat beberapa detik dan bagian video mungkin tidak dapat diputar dengan benar, tetapi datanya ada di sana dan Anda dapat mengonversi masing-masing bagian mis.

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

Bergabung kembali dengan bagian yang disandikan

Buat file teks dan masukkan nama setiap file yang diberikan seperti ini

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

Dan lari

ffmpeg -f concat -i textfile -c copy -fflags +genpts recording-encoded.mp4
Gyan
sumber
Hanya memiliki memori 6GB, dan perkiraan waktu 12 jam untuk melakukan enconde dari x264 ke x265 dan tidak memiliki jeda (desktop), saya tidak dapat menggunakan trik VM, tetapi ini terdengar hebat! Saya hanya berharap langkah bergabung kembali cepat, tetapi karena tidak akan ada pengkodean di atasnya, saya pikir itu akan terjadi. Harus mencobanya, thx vm!
Aquarius Power
itu menciptakan peringatan ketika bergabung: "Codec untuk streaming 0 tidak menggunakan tajuk global tetapi format wadah memerlukan tajuk global" tetapi hasil akhirnya adalah video yang dapat digunakan, saya tidak melihat masalah sama sekali
Aquarius Power
4

Saya menyarankan daripada berhenti, Anda memberikan proses pengkodean prioritas sistem paling sedikit (alias " renice "), sehingga Anda dapat bekerja setiap hari dengan nyaman dan pengkodean akan dilakukan di latar belakang dengan sumber daya sistem yang tidak digunakan. Jadi, pengkodean Anda akan berlangsung selama 24/7 tanpa gangguan, tanpa bertentangan dengan pekerjaan sehari-hari

karena AFAIK OSX tidak memiliki perintah pidof, Anda perlu mengetahui nomor proses ffmpeg (PID)

maka Anda dapat renice proses untuk background menganggur dengan

sudo renice 20 yourPID

jika diperlukan Anda juga dapat mengubah proses menjadi prioritas latar depan yang lebih agresif

sudo renice -10 yourPID
John Qube
sumber
Hai! Saran yang bagus Harus mencobanya.
Winterflags
4

Menangguhkan Utas juga berfungsi pada Windows, bukan dengan ctrl+ Z, tetapi di pengelola sumber daya, Anda juga dapat melanjutkannya di sana.

Jan Christian Grünhage
sumber
1

(Ini untuk Linux)

Seperti yang mungkin Anda semua tahu, menekan 'q' mengakhiri file rekaman.

ffplay memiliki 'p'-kemungkinan. Mengapa ffmpeg tidak memiliki hal yang sama? Mungkin karena itu dapat menyebabkan desync antara video dan audio? ...

Saya hanya ffmpeg-encode ke x264-aac-mkv dengan crf (23) dan selalu dengan kondisi video yang sama, 'berhenti' (q) rekaman dan bergabung dengan semua segmen dalam dir tertentu, di mana skrip ini berada, ke 1 file dalam mode streamcopy dengan skrip bash ini:

#!/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 

Setelah itu saya memeriksa hasil video gabungan dan menempelkannya ke dir lain. Segmen dihapus dari dir gabungan.

Tapi, tombol 'Jeda & Lanjutkan' tanpa kerumitan akan diterima;)

xinu
sumber
0

Ini hanya sebuah ide, tetapi jika Anda memiliki anggaran, itu akan menjadi ide yang baik untuk meningkatkan baik prosesor (ke gen 8th Intel) atau bahkan lebih baik, kartu video (ke NVIDIA GTX 1050 atau lebih tinggi) sehingga Anda dapat menyandikan h.265 / HEVC dengan akselerasi perangkat keras dan bukannya CPU-intensif x265. Pengkodean video Anda akan selesai dalam waktu kurang dari 20 jam, menghemat biaya listrik Anda juga.

Hendy Irawan
sumber