Catatan pengembang AI Leifeng.com: Baru-baru ini, NVIDIA telah open source kerangka pemrosesan video "VideoProcessingFramework (VPF)" untuk Python. Kerangka kerja ini memberi pengembang alat Python sederhana namun kuat yang dapat digunakan untuk tugas encoding, decoding, dan pemrosesan yang dipercepat perangkat keras.
Pada saat yang sama, berkat kode C ++ yang diikat oleh Python, ini memungkinkan pengembang mencapai pemanfaatan GPU yang lebih tinggi dalam lusinan baris kode. Bingkai video yang didekodekan diekspos dalam bentuk array NumPy atau penunjuk perangkat CUDA untuk menyederhanakan proses interaksi dan fungsi tambahannya.
Saat ini, VPF tidak memberlakukan batasan apa pun pada NVIDIA Video Codec SDK, dan pengembang dapat memanfaatkan fitur GPU profesional NVIDIA sepenuhnya.
Kerangka pemrosesan video yang dipercepat perangkat keras VPF dengan Python
VPF adalah framework lintas platform open source berbasis CMake. VPF bergantung pada library FFmpeg untuk (de) muxing dan proyek pybind11 untuk membuat binding Python. Ini berisi satu set pustaka C ++ open source dan binding Python, yang dapat berinteraksi dengan Codec SDK kode sumber tertutupnya.
Fungsi utama framework ini adalah untuk menyederhanakan proses pengembangan encoding / decoding video yang dipercepat GPU dari Python. Framework ini dapat memberikan akselerasi hardware lengkap untuk tugas pemrosesan video (seperti decoding, encoding, transcoding, dan ruang warna yang dipercepat GPU serta konversi format piksel).
Meskipun Python bukan bahasa dengan kinerja tertinggi, itu mudah digunakan; setelah NVIDIA merilis kerangka pemrosesan video ini, itu setara dengan pembungkus Python di sekitar tumpukan Video Codec SDK C ++ yang ada dan akan digunakan di Kepler dan yang lebih baru Encoding / decoding video berbasis GPU. Hal ini memungkinkan VPF menggunakan akselerasi video performa tinggi berbasis GPU sembari mendapatkan kode yang mudah dibaca / ditulis.
Diagram skematik penggunaan NVIDIA Video Codec SDK
Pada saat yang sama, perlu dicatat bahwa VPF juga menggunakan NVIDIA Video Codec SDK (satu set lengkap API, termasuk alat berperforma tinggi, contoh, dan dokumentasi untuk encoding dan decoding video yang dipercepat perangkat keras pada Windows dan Linux) untuk meningkatkan fleksibilitas dan kinerja, dan Memberi pengembang kemudahan penggunaan Python yang melekat. Saat ini, kodenya adalah open source di GitHub.
Alamat Github:
https://github.com/NVIDIA/VideoProcessingFramework
Contoh dan hasil kode
Ketika VPF diumumkan di blog situs web resmi, pengembang juga memberikan contoh kode Python singkat yang menggunakan modul PyNvCodec untuk menampilkan transcoding video dengan Python:
impor PyNvCodec sebagai nvc
gpuID = 0
encFile = "big_buck_bunny_1080p_h264.mov"
xcodeFile = buka ("big_buck_bunny_1080p.h264", "wb")
nvDec = nvc.PyNvDecoder (encFile, gpuID)
nvEnc = nvc.PyNvEncoder ({'preset': 'hq', 'codec': 'h264', 's': '1920x1080'}, gpuID)
sementara Benar:
rawSurface = nvDec.DecodeSingleSurface
# Decoder akan mengembalikan permukaan nol jika file input selesai;
jika tidak (rawSurface.GetCudaDevicePtr):
istirahat
encFrame = nvEnc.EncodeSingleSurface (rawSurface)
if (encFrame.size):
frameByteArray = bytearray (encFrame)
xcodeFile.write (frameByteArray)
# Encoder tidak sinkron, jadi kita perlu menghapusnya
encFrames = nvEnc.Flush
untuk encFrame di encFrames:
encByteArray = bytearray (encFrame)
xcodeFile.write (encByteArray)
Meski desain contoh ini sederhana, VPF tetap memiliki performa yang baik. Contoh konversi kode yang ditunjukkan di atas cukup untuk memenuhi unit Nvenc pada GPU RTX 5000, seperti yang ditunjukkan di bawah ini:
Urutan Big Buck Bunny berisi 14315 bingkai, yang dapat ditranskode dalam 32 detik tanpa menggunakan teknologi canggih apa pun (seperti mode produsen-konsumen). Dekoder dan pembuat enkode akan memulai antrean dekoder bersama di utas terpisah , Yang dapat mentranskode sekitar 447fps. Karena semua transcoding dilakukan pada GPU, tidak ada beban CPU yang signifikan.
VPF menggunakan deskripsi kelas
VPF berisi beberapa kelas, yang intinya adalah kelas PyNvDecoder dan PyNvEncoder, yang terikat ke Python dari NVIDIA Video Codec SDK.
Kelas PyNvDecoder dan PyNvEncoder mendukung format piksel NV12. Semua konversi dipercepat oleh GPU dan diselesaikan dalam memori VRAM untuk meningkatkan kinerja. diantara mereka--
Kelas PyNvDecoder memiliki lima metode utama:
-
DecodeSingleSurface Dekode satu frame dari video input dan kembalikan Surface dengan piksel yang didekodekan. Saat berikutnya pengguna memanggil metode ini, permukaan yang dikembalikan sebelumnya dapat digunakan kembali. Jika bingkai tidak didekodekan, metode GetCudaDevicePtr dari permukaan yang didekodekan akan mengembalikan nol;
-
DecodeSingleFram Dekode satu frame dari video input dan kembalikan array NumPy dengan piksel yang didekodekan. Saat berikutnya pengguna memanggil metode ini, instance array NumPy lainnya akan dikembalikan. Jika bingkai tidak didekodekan, itu akan mengembalikan array NumPy kosong. Operasi ini menyalin perangkat ke memori host;
-
Lebar Mengembalikan lebar bingkai yang diterjemahkan;
-
Tinggi Mengembalikan tinggi bingkai yang didekodekan;
-
PixelFormat Mengembalikan format piksel bingkai yang telah didekode.
Saat pengguna menggunakan DecodeSingleSurface dan DecodeSingleFrame, status internal decoder tidak akan dihancurkan. Kelas decoder mendukung codec H.264 dan H.265.
Kelas PyNvEncoder memiliki enam metode:
-
EncodeSingleSurface Dapatkan NV12 Surface dalam raw pixel, enkodekan, lalu kembalikan bitstream video dasar sebagai array NumPy. Pembuat enkode bersifat asinkron, jadi metode ini dapat mengembalikan larik kosong dalam beberapa panggilan pertama (bergantung pada setelan pembuat enkode), ini bukan kesalahan enkode;
-
EncodeSingleFrame Dapatkan array NumPy dengan piksel mentah, enkodekannya, lalu kembalikan bitstream video dasar sebagai array NumPy. Pembuat enkode bersifat asinkron, jadi metode ini dapat mengembalikan larik kosong dalam beberapa panggilan pertama (bergantung pada setelan pembuat enkode);
-
Menyiram Hapus encoder. Kecuali semua frame asli dalam antrian encoder telah dikodekan, ia tidak akan mengembalikan dan mengembalikan daftar array NumPy dengan byte aliran elementer;
-
Lebar Kembalikan lebar bingkai yang dikodekan;
-
Tinggi Mengembalikan tinggi frame yang dikodekan;
-
PixelFormat Mengembalikan format piksel dari bingkai yang dikodekan.
Jika pengguna menggunakan EncodeSingleSurface dan EncodeSingleFrame, status internal pembuat enkode tidak akan dimusnahkan. Selain itu, PyNvEncoder dapat memperoleh bingkai masukan dari resolusi apa pun dan mengubah ukurannya di GPU segera sebelum pengodean sebenarnya.
Kelas encoder mendukung codec H.264 dan H.265 serta memiliki latensi rendah. Oleh karena itu, di akhir sesi encoding, Anda harus memanggil Flush untuk menyegarkan antrean frame encoder.
Kelas HardwareSurface berisi pembungkus CUdeviceptr:
-
GetCudaDevicePtr Kembalikan CUdeviceptr ke objek memori CUDA.
Untuk transfer memori antara host dan perangkat, ada dua kelas bernama PyFrameUploader dan PySurfaceDownloader:
-
PyFrameUploader Digunakan untuk mengunggah larik NumPy ke GPU;
-
UploadSingleFrame Unggah larik numpy ke GPU, dan kemudian kembalikan pegangan ke Surface yang diunggah. Saat berikutnya pengguna memanggil metode ini, permukaan yang dikembalikan sebelumnya dapat digunakan kembali.
Kelas PySurfaceDownloader digunakan untuk mengunduh Surface dari GPU. Kelas ini hanya berisi satu metode:
-
UnduhSingleSurface Unduh Surface sisi GPU ke jajaran numpy sisi CPU. Saat berikutnya pengguna memanggil metode ini, instance larik numpy lainnya akan dikembalikan.
Kelas PySurfaceConverter digunakan untuk ruang warna akselerasi GPU dan konversi format piksel. Berikut ini adalah daftar konversi yang didukung:
-
YUV420 hingga NV12
-
NV12 hingga YUV420
-
NV12 ke RGB
Kelas PySurfaceConverter berisi satu metode:
-
Menjalankan Lakukan konversi pada GPU dan kembalikan pegangan ke Surface dalam format output. Saat berikutnya pengguna memanggil metode ini, permukaan yang dikembalikan sebelumnya dapat digunakan kembali.
Ada dua jenis data utama yang dijalankan VPF:
-
Array NumPy untuk data sisi CPU;
-
Kelas Surface transparan pengguna, yang mewakili data sisi GPU;
Karena alokasi objek memori sisi GPU sangat rumit dan akan sangat mempengaruhi kinerja, semua mengembalikan Surface dan menggunakan kembali metode kelas VPF yang dikembalikan sebelumnya di panggilan berikutnya.
Perbedaannya adalah bahwa metode kelas VPF akan mengembalikan instance array NumPy baru setiap kali dipanggil. Pindah konstruktor dapat menghindari biaya penyalinan memori.
Kerangka kerja pemrosesan video open source lainnya
Satu, RxFFmpeg
RxFFmpeg adalah kerangka kerja pemrosesan cepat untuk pengeditan audio dan video serta pengeditan video berdasarkan (FFmpeg 4.0 + X264 + mp3lame + fdk-aac) yang dikompilasi untuk platform Android.
Berisi: penyambungan video, transcoding, kompresi, pemotongan, kredit, pemisahan audio dan video, perubahan kecepatan, menambahkan stiker statis dan stiker dinamis gif, menambahkan subtitle, menambahkan filter, menambahkan musik latar, mempercepat dan memperlambat video, memutar ulang audio dan video, audio Fitur-fitur utama seperti cropping, voice change, audio mixing, video sintesis gambar, video decoding gambar dan sebagainya.
Alamat sumber terbuka RxFFmpeg:
https://github.com/microshow/RxFFmpeg
Dua, VidGear
VidGear adalah pembungkus python ringan di sekitar modul I / O video OpenCV. VidGear dibuat menggunakan Multi-threaded Gears (alias API), masing-masing dengan fitur perintis yang unik.
API ini menyediakan pembungkus multi-utas yang mudah digunakan dan sangat dapat diperluas di sekitar banyak pustaka python tingkat rendah terbaru, seperti OpenCV, FFmpeg, picamera, pafy, pyzmq dan python-mss , yang dapat digunakan di berbagai perangkat dan Fungsi pembacaan bingkai video berkecepatan tinggi direalisasikan di platform. Ini juga merupakan implementasi ulang modul video dari pustaka imutils, memperbaiki semua bug utama, dan dilengkapi dengan dukungan streaming jaringan langsung.
Alamat sumber terbuka VidGear:
https://pypi.org/project/vidgear/
Alamat blog VPF:
https://devblogs.nvidia.com/vpf-hardware-accelerated-video-processing-framework-in-python/
Leifeng.com AI Developer Leifeng.com
- Tencent menanggapi "pemutusan hubungan kerja yang hebat"; Apple jarang berpartisipasi dalam CES; Samsung berencana untuk memproduksi chip 3nm pertama Lei Feng Morning Post
- Today Paper | Sistem Tanya Jawab; bentuk dan postur manusia 3D; Deteksi pemalsuan wajah; AdderNet, dll.
- Debut "Induction Cooker Combination"! Lei Jun mengumumkan bahwa dia akan bergabung dengan Xiaomi secara teratur, ulang tahun pertama Lu Weibing
- Bisakah "data palsu" melatih model yang baik? Uber berkata: Tidak hanya itu mungkin, tetapi juga 9 kali lebih cepat