LoginSignup
0
0

More than 3 years have passed since last update.

NVENCを用いた複数並列エンコード【FFMPEG】

Posted at

NVENCを用いた複数ストリームエンコード【FFMPEG】

以前の記事で触れたNVENCチップの搭載数と最大セッション数の話
ffmpeg NVENC についての(個人的な)評価とまとめ
Video Encode and Decode GPU Support Matrix
この意味を最近考えるようになったので検証・まとめを行う
hoge.png
このPCに搭載しているGPU (Titan X) は 1GPU, 2NVENC チップを搭載しており、
最大のセッション数は3である

ならば3本まで並列でNVENCを走らせることができる
(確認済み:4本目からエラー)

検証環境

マシン

hoge2.png
SSD には PCIe Gen4 接続のものを使用している

動画

No SIZE No SIZE No SIZE No SIZE
01 351MB 06 320MB 11 338MB 16 334MB
02 357MB 07 358MB 12 338MB 17 306MB
03 329MB 08 348MB 13 344MB 18 329MB
04 293MB 09 363MB 14 337MB 19 330MB
05 275MB 10 330MB 15 340MB

フルHD, 20Mbps

ffmpeg コマンド

ffmpeg -i 入力動画.mp4 -vf transpose=1 -c:v nvenc -b:v 20M 出力名.mp4

90度時計回りに回転させる

結果

hoge3.png
約2倍まで速くなる (x1.85)
3倍にはならなそう

ソースコード

rotate.pl
$inp = $ARGV[0];
$oup = $ARGV[1];

$cmd = "ffmpeg -i ". $inp. " -vf transpose=1 -c:v nvenc -b:v 20M res/".$oup.".mp4";

print $cmd , "\n";
system $cmd;
main.go
package main

import (
    "fmt"
    "sync"
    "os"
    "os/exec"
)

func main() {
    println(len(os.Args))
    multirote()
}

func multirote() {
    limit := 3
    num := len(os.Args) - 1
    slots := make(chan struct{}, limit)
    var wg sync.WaitGroup
    wg.Add(num)

    for i := 0; i < num; i++ {
        i := i
        slots <- struct{}{}
        go func () {
            fmt.Printf("<%02d/%02d> begin\n", i + 1, num)
            cmd := exec.Command("perl", "rotate.pl", os.Args[i + 1], fmt.Sprintf("%02d", i + 1))
            _, err := cmd.Output()

            if err != nil {
                fmt.Println(err)
            }
            fmt.Printf("<%02d/%02d> done\n", i + 1, num)
            <-slots
            wg.Done()
        }()
    }
    wg.Wait()
}

limit の数を変更して、最大並列数を変更する

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0