NVENCを用いた複数ストリームエンコード【FFMPEG】
以前の記事で触れたNVENCチップの搭載数と最大セッション数の話
ffmpeg NVENC についての(個人的な)評価とまとめ
Video Encode and Decode GPU Support Matrix
この意味を最近考えるようになったので検証・まとめを行う
このPCに搭載しているGPU (Titan X) は 1GPU, 2NVENC チップを搭載しており、
最大のセッション数は3である
ならば3本まで並列でNVENCを走らせることができる
(確認済み:4本目からエラー)
検証環境
マシン
動画
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度時計回りに回転させる
結果
ソースコード
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 の数を変更して、最大並列数を変更する