https://github.com/materight/pyav-cuda
Extension of PyAV with hardware encoding and decoding support. Compatible with PyTorch and Nvidia codecs.
https://github.com/materight/pyav-cuda
cuda cuvid ffmpeg libav pytorch
Last synced: about 1 month ago
JSON representation
Extension of PyAV with hardware encoding and decoding support. Compatible with PyTorch and Nvidia codecs.
- Host: GitHub
- URL: https://github.com/materight/pyav-cuda
- Owner: materight
- License: mit
- Created: 2024-07-15T13:44:50.000Z (10 months ago)
- Default Branch: main
- Last Pushed: 2024-11-08T08:30:05.000Z (7 months ago)
- Last Synced: 2025-03-24T20:11:44.158Z (2 months ago)
- Topics: cuda, cuvid, ffmpeg, libav, pytorch
- Language: Cython
- Homepage:
- Size: 38.1 KB
- Stars: 0
- Watchers: 1
- Forks: 1
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# PyAV-CUDA
[](https://pypi.org/project/avcuda/)**PyAV-CUDA** is an extension of [PyAV](https://github.com/PyAV-Org/PyAV) that adds support for hardware-accelerated video decoding using Nvidia GPUs. It integrates with FFmpeg and PyTorch, providing CUDA-accelerated kernels for efficient color space conversion.
## Installation
1. Build and install FFmpeg with [hardware acceleration support](https://pytorch.org/audio/stable/build.ffmpeg.html).
2. To enable hardware acceleration in PyAV, it needs to be reinstalled from source. Assuming FFmpeg is installed in `/opt/ffmpeg`, run:
```bash
pip uninstall av
PKG_CONFIG_LIBDIR="/opt/ffmpeg/lib/pkgconfig" pip install av --no-binary av --no-cache
```
If the installation was successful, `h264_cuvid` should appear between the available codecs:
```python
import av
print(av.codecs_available)
```3. Install PyAV-CUDA:
```bash
PKG_CONFIG_LIBDIR="/opt/ffmpeg/lib/pkgconfig" CUDA_HOME="/usr/local/cuda" pip install avcuda
```4. Test the installation by running `python examples/benchmark_decode.py`. The output should show something like:
```
Running CPU decoding... took 34.99s
Running GPU decoding... took 8.30s
```## Usage
### Decoding
```python
import av
import avcudaCUDA_DEVICE = 0
with av.open("video.mp4") as container:
stream = container.streams.video[0]
avcuda.init_hwcontext(stream.codec_context, CUDA_DEVICE)for avframe in container.decode(stream):
frame_tensor = avcuda.to_tensor(avframe, CUDA_DEVICE)
```### Encoding
```python
import av
import avcudaCUDA_DEVICE = 0
NUM_FRAMES = 100
FPS = 30
WIDTH = 640
HEIGHT = 480with av.open("video.mp4", "w") as container:
stream = container.add_stream("h264_nvenc", rate=FPS)
stream.pix_fmt, stream.width, stream.height = "yuv420p", WIDTH, HEIGHTavcuda.init_hwcontext(stream.codec_context, CUDA_DEVICE)
for _ in range(NUM_FRAMES):
frame_tensor = torch.randint(0, 255, (HEIGHT, WIDTH, 3), dtype=torch.uint8, device=CUDA_DEVICE)
avframe = avcuda.from_tensor(frame_tensor, stream.codec_context)for packet in stream.encode(avframe):
container.mux(packet)
```