Cara meminimalkan penggunaan CPU / memori oleh ffmpeg saat merekam video

13

Saya menggunakan FFmpeg untuk membuat tangkapan layar video dari tampilan Xvfb.

Saat ini saya memohonnya dengan:

ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov

Saat saya merekam video dari sekitar 5 sesi Xvfb, penggunaan CPU saya sangat tinggi dan ada kelambatan karenanya. Juga penggunaan memori sekitar 300 MB untuk setiap proses ffmpeg.

Parameter mana untuk ffmpeg yang harus saya gunakan untuk meminimalkan penggunaan sumber daya komputer (terutama CPU dan memori) saat membuat tangkapan layar video?

Andrei Botalov
sumber

Jawaban:

17

1. Buat output RGB lossless terlebih dahulu

ffmpeg -y -framerate 25 -video_size 1280x1024 -f x11grab -i :0.0 -c:v libx264rgb \
-crf 0 -preset ultrafast temp.mp4
  • Inputnya adalah RGB, jadi menggunakan encoder libx264rgb akan menghindari konversi RGB ke YUV yang berpotensi lambat yang akan terjadi jika Anda menggunakan libx264 biasa.

  • Ini menggunakan preset penyandian x264 tercepat: ultrafast.

  • Outputnya akan lossless karena -crf 0digunakan.

2. Kemudian menyalin ulang

Output dari perintah pertama akan sangat besar, dan sebagian besar pemain bodoh tidak dapat menangani RGB H.264 sehingga Anda dapat menyandikan ulang:

ffmpeg -i temp.mp4 -c:v libx264 -crf 23 -preset medium -vf format=yuv420p out.mp4
  • Anda dapat bereksperimen dengan -crfnilai untuk mengontrol kualitas output. Kisaran subyektif waras adalah 18-28, di mana 18 secara visual lossless atau hampir jadi. Defaultnya adalah 23.

  • Gunakan preset paling lambat Anda memiliki kesabaran untuk: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow. Defaultnya adalah medium.

  • Saya menambahkan -vf format=yuv420puntuk memastikan output bekerja dengan pemain bodoh seperti QuickTime dan Windows Media Player. Anda dapat menghilangkan ini jika mengunggahnya ke YouTube atau hanya memutarnya di VLC, mpv, MPlayer, atau pemutar berbasis FFmpeg lainnya.

Lihat juga

llogan
sumber
Saya merekam video dari tampilan non-standar (ini Xvfb) sehingga dapat berupa angka
Andrei Botalov
@AndreyBotalov Apakah Anda mencoba metode lossless? Apakah kinerjanya lebih baik untuk Anda?
Logan
1
Saat ini saya memohon ffmpegdengan -preset superfastparameter (saya belum mencoba -crf). Dibutuhkan lebih sedikit sumber daya dalam kasus tersebut dan menghasilkan video dengan ukuran yang cukup baik.
Andrei Botalov
@AndreyBotalov -crf 23digunakan secara default jika Anda tidak mendeklarasikan nilai, tetapi jika superfastcukup untuk Anda, maka mungkin masalahnya sudah terpecahkan.
Logan
1
Anda juga dapat mencoba penyandian perangkat keras melalui h264_nvenc (nvidia) atau h264_qsv (cpu intel modern). Ini akan mengalihkan beban penyandian dari CPU Anda ke perangkat keras h264 khusus.
Kenn
4

Lebih baik berkonsentrasi menggunakan opsi ffmpeg berbeda yang akan mencapai hasil yang sama dengan cara yang menggunakan sumber daya lebih sedikit. Yang mengatakan, ada cara untuk menggunakan lebih sedikit sumber daya jika Anda benar-benar perlu menyelesaikan hal tertentu dengan ffmpeg dan menggunakan terlalu banyak sumber daya.

Anda dapat mengurangi prioritas ffmpegproses CPU:

  • Metode Terminal: Gunakan niceperintah untuk mengubah prioritas proses ini: nice -n 8 ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov. Di Linux, angka prioritas ( niceformat perintah nice -n <priority> <command>) berkisar dari -20 hingga 20. Semakin besar bilangan bulat, semakin rendah prioritasnya; netral adalah 0. Jika Anda menggunakan perintah yang saya berikan dan mengaturnya ke 8, CPU akan memberikan waktu proses lebih sedikit, yang sepertinya kurang "daya". Jika angka ini terlalu tinggi atau rendah, tentu saja, Anda dapat mengubahnya.
  • Metode GUI: Ini tidak disarankan karena memberi Anda lebih sedikit kontrol atas angka pastinya dan itu tidak berlaku segera setelah proses dimulai. Namun, itu lebih mudah dipahami. Dengan ffmpegberjalan, buka Monitor Sistem. Gulir ke bawah ke proses bernama ffmpeg, klik kiri untuk memilih, klik kanan, dan tetapkan prioritas ke "Rendah" atau "Sangat Rendah".

Jika Anda khawatir tentang penggunaan memori juga, ketahuilah bahwa tidak mungkin untuk mengatakan suatu proses untuk hanya mengambil begitu banyak memori dan masih berjalan. Kernel secara otomatis mengontrol alokasi memori untuk proses. Ada cara untuk mengurung proses, dengan timeoutskrip membatasi , sehingga ketika proses dan proses anak memakan terlalu banyak memori (batas yang ditentukan oleh Anda) mereka diakhiri dengan aman dan pemberitahuan ditampilkan. Namun, jika suatu proses hanya diberi begitu banyak memori (katakanlah oleh kernel) dan ia meminta lebih banyak memori yang tidak dapat dimiliki, itu akan macet.

Beberapa hal bermanfaat yang perlu diketahui:

Menggunakan pengetahuan Cgroups, Anda dapat melakukan banyak hal menyenangkan seperti mengendalikan swappiness suatu proses.

Richard
sumber
2
Jika saya mengerti benar menempatkan ffmpeg ke antrian prioritas yang lebih rendah akan membuatnya menghasilkan video dengan lag yang tidak diinginkan.
Andrei Botalov
1
Hmm ... Saya tidak melihat online mengatakan bahwa ... Apakah Anda memiliki sumber yang menunjukkan itu? (Jika tidak, itu seharusnya bug).
Richard
2
Jika saya mengerti dengan benar, prioritas yang lebih rendah berarti bahwa ffmpeg akan memiliki lebih sedikit waktu prosesor daripada sekarang. Tetapi prosesor dimuat hampir 100% jadi saya pikir reprioritisasi tidak akan membantu
Andrei Botalov
1
Ini dirancang untuk membatasi penggunaan CPU pada proses, jadi jika CPU Anda berjalan pada 100%, ia akan lebih mudah menanganinya.
Richard
4
Saya sudah -1 ini, karena tidak peduli bagaimana Anda mengubah prioritas, itu hanya akan membuatnya lebih buruk. Mengatur prioritas yang lebih rendah akan menurunkan waktu CPU untuk ffmpeg yang menghasilkan lebih banyak frame yang terjatuh, atau, dengan meningkatkan prioritas, itu akan memperlambat proses lain pada sistem bahkan lebih. Kedua hasil tidak diinginkan.
gertvdijk
0

-re (input) Baca input pada frame rate asli. Terutama digunakan untuk mensimulasikan perangkat ambil, atau aliran input langsung (misalnya saat membaca dari file). Seharusnya tidak digunakan dengan perangkat ambil aktual atau aliran input langsung (di mana ia dapat menyebabkan hilangnya paket). Secara default, ffmpeg mencoba membaca input secepat mungkin. Opsi ini akan memperlambat pembacaan input ke frame rate asli input. Ini berguna untuk keluaran waktu nyata (misalnya streaming langsung).

劉 大為
sumber
"Seharusnya tidak digunakan dengan perangkat grab yang sebenarnya" seperti x11grab.
llogan