web-dev-qa-db-ja.com

マルチトラックビデオはリアルタイムでトランスコードされません

最近、Nvidiaのエンコード制限をバイパスするための専用のこのGithubページで、Windowsのサポートが追加されました: https://github.com/keylase/nvidia-patch/tree/master/win

これまで、コンシューマーNvidia GPUに課せられたエンコード制限のために、GPUとCPU全体で5つのライブストリームをエンコードしてきました。したがって、GPUで2ストリーム、CPUで3ストリームです。しかし、このパッチの助けを借りて、GPUだけで5つのストリームすべてをエンコードできるようになりました。これは、5つの個別の出力ビデオをエンコードするのではなく、すべてのストリームを1つのファイルにエンコードできる可能性があることを考えています。

セグメンテーションの性質上、5つの個別の出力ファイルすべての同期を維持するコマンドを作成することは非常に困難でした。したがって、1つのファイルですべてを実行すれば、これらの問題のいくつかを回避して、ワークフロー/コマンドを簡素化できると考えています。ただし、すべてを1つの出力ファイルに入れようとすると、リアルタイムでトランスコードできないことがわかりました。

コマンドの例:

ffmpeg -y -hide_banner -thread_queue_size 9999 -indexmem 9999 -f dshow -rtbufsize 2147M -video_size 3840x2160 `
-framerate 60 -pixel_format nv12 -i video="Video (Pro Capture)":audio="ADAT (3+4) (RME Fireface UC)" `
-thread_queue_size 9999 -indexmem 9999 -f dshow -rtbufsize 2147M -video_size 3840x2160 -framerate 60 -pixel_format nv12 `
-i video="AVerMedia HD Capture GC573 1":audio="Analog (1+2) (RME Fireface UC)" `
-thread_queue_size 9999 -indexmem 9999 -f dshow -rtbufsize 2147M -video_size 1920x1080 -framerate 60 -pixel_format yuv420p `
-i video="Game Capture HD60 Pro (Video) (#01)":audio="Game Capture HD60 Pro (Audio) (#01)" `
-thread_queue_size 9999 -indexmem 9999 -f dshow -rtbufsize 2147M -i audio="ADAT (5+6) (RME Fireface UC)" `
-thread_queue_size 9999 -indexmem 9999 -f dshow -rtbufsize 2147M -i audio="SPDIF/ADAT (1+2) (RME Fireface UC)" `
-c:v h264_nvenc -preset: llhp -pix_fmt nv12 -b:v 288M -minrate 288M -maxrate 288M -bufsize 288M -c:a aac -ar 44100 `
-b:a 384k -vsync 1 -max_muxing_queue_size 9999 -map 0 -map 1 -map 2 -map 3 -map 4 `
-f segment -segment_time 600 -segment_wrap 9 -reset_timestamps 1 -segment_format_options max_delay=0 `
C:\Users\djcim\Videos\FFmpeg\FFmpeg%02d.ts

上記のコマンドはリアルタイムでトランスコードせず、約.6倍の速度で動作します。ただし、すべてを複数の出力に単純に分離すると、リアルタイムでトランスコードされます。

ffmpeg -y -hide_banner `
-thread_queue_size 9999 -indexmem 9999 -f dshow -rtbufsize 2147.48M -i audio="Analog (1+2) (RME Fireface UC)" `
-thread_queue_size 9999 -indexmem 9999 -f dshow -rtbufsize 2147.48M -i audio="ADAT (5+6) (RME Fireface UC)" `
-thread_queue_size 9999 -indexmem 9999 -r 25 -f lavfi -rtbufsize 2147.48M -i color=c=black:s=256x120 `
-thread_queue_size 9999 -indexmem 9999 -f dshow -rtbufsize 2147.48M -video_size 1920x1080 -framerate 60 `
-pixel_format yuv420p -i video="Game Capture HD60 Pro (Video) (#01)":audio="Game Capture HD60 Pro (Audio) (#01)" `
-thread_queue_size 9999 -indexmem 9999 -f dshow -rtbufsize 2147.48M -video_size 3840x2160 -framerate 60 `
-pixel_format nv12 -i video="Video (Pro Capture)":audio="ADAT (3+4) (RME Fireface UC)" `
-thread_queue_size 9999 -indexmem 9999 -f dshow -rtbufsize 2147.48M -video_size 3840x2160 -framerate 60 `
-pixel_format nv12 -i video="AVerMedia HD Capture GC573 1":audio="Analog (1+2) (RME Fireface UC)" `
-map 2,0 -map 0 -c:v h264_nvenc -preset: llhp -r 25 -rc-lookahead 25 -pix_fmt nv12 -b:v 288M -minrate 288M `
-maxrate 288M -bufsize 288M -c:a aac -ar 44100 -b:a 384k -vsync 1 -max_muxing_queue_size 9999 `
-f segment -segment_time 600 -segment_wrap 9 -reset_timestamps 1 -segment_format_options max_delay=0 `
C:\Users\djcim\Videos\FFmpeg\CP\CP%02d.ts `
-map 2,1 -map 1 -c:v h264_nvenc -preset: llhp -r 25 -rc-lookahead 25 -pix_fmt nv12 -b:v 288M -minrate 288M `
-maxrate 288M -bufsize 288M -c:a aac -ar 44100 -b:a 384k -vsync 1 -max_muxing_queue_size 9999 `
-f segment -segment_time 600 -segment_wrap 9 -reset_timestamps 1 -segment_format_options max_delay=0 `
C:\Users\djcim\Videos\FFmpeg\SB\SB%02d.ts `
-map 3:0,3:1 -map 3:1 -c:v h264_nvenc -preset: llhp -r 60 -rc-lookahead 60 -pix_fmt yuv420p -b:v 288M -minrate 288M `
-maxrate 288M -bufsize 288M -c:a aac -ar 44100 -b:a 384k -vsync 1 -max_muxing_queue_size 9999 `
-f segment -segment_time 600 -segment_wrap 9 -reset_timestamps 1 -segment_format_options max_delay=0 `
C:\Users\djcim\Videos\FFmpeg\EL\EL%02d.ts `
-map 4:0,4:1 -map 4:1 -c:v h264_nvenc -preset: llhp -r 60 -rc-lookahead 60 -pix_fmt nv12 -b:v 288M -minrate 288M `
-maxrate 288M -bufsize 288M -c:a aac -ar 44100 -b:a 384k -vsync 1 -max_muxing_queue_size 9999 `
-f segment -segment_time 600 -segment_wrap 9 -reset_timestamps 1 -segment_format_options max_delay=0 `
C:\Users\djcim\Videos\FFmpeg\MW\MW%02d.ts `
-map 5:0,5:1 -map 5:1 -c:v h264_nvenc -preset: llhp -r 60 -rc-lookahead 60 -pix_fmt nv12 -b:v 288M -minrate 288M `
-maxrate 288M -bufsize 288M -c:a aac -ar 44100 -b:a 192k -vsync 1 -max_muxing_queue_size 9999 `
-f segment -segment_time 600 -segment_wrap 9 -reset_timestamps 1 -segment_format_options max_delay=0 `
C:\Users\djcim\Videos\FFmpeg\AM\AM%02d.ts

これは、上記のコマンドが実際に使用するもののはるかに単純化されたバージョンであることも言うまでもありません。通常、各出力に無数の同期オプションを追加しますが、リアルタイムでトランスコードする機能とはあまり関係ありません。

単一ファイルソリューションが苦労するのに、後者が苦労しない理由はありますか?そして、可能であれば、解決策はありますか?

2
Nimble

パズルに欠けていたのは-rc-lookaheadでしたが、これは私の元の投稿の2番目のコマンドからどういうわけか省略されていました。

マルチトラックファイルに-rc-lookahead60を追加すると、リアルタイムのトランスコーディングにかなり早く到達します。例:

ffmpeg -y -hide_banner -thread_queue_size 9999 -indexmem 9999 -f dshow -rtbufsize 2147M -video_size 3840x2160 `
-framerate 60 -pixel_format nv12 -i video="Video (Pro Capture)":audio="ADAT (3+4) (RME Fireface UC)" `
-thread_queue_size 9999 -indexmem 9999 -f dshow -rtbufsize 2147M -video_size 3840x2160 -framerate 60 -pixel_format nv12 `
-i video="AVerMedia HD Capture GC573 1":audio="Analog (1+2) (RME Fireface UC)" `
-thread_queue_size 9999 -indexmem 9999 -f dshow -rtbufsize 2147M -video_size 1920x1080 -framerate 60 -pixel_format yuv420p `
-i video="Game Capture HD60 Pro (Video) (#01)":audio="Game Capture HD60 Pro (Audio) (#01)" `
-thread_queue_size 9999 -indexmem 9999 -f dshow -rtbufsize 2147M -i audio="ADAT (5+6) (RME Fireface UC)" `
-thread_queue_size 9999 -indexmem 9999 -f dshow -rtbufsize 2147M -i audio="SPDIF/ADAT (1+2) (RME Fireface UC)" `
-c:v h264_nvenc -preset: llhp -pix_fmt nv12 -rc-lookahead 60 -b:v 288M -minrate 288M -maxrate 288M -bufsize 288M -c:a aac `
-ar 44100 -b:a 384k -vsync 1 -max_muxing_queue_size 9999 -map 0 -map 1 -map 2 -map 3 -map 4 `
-f segment -segment_time 600 -segment_wrap 9 -reset_timestamps 1 -segment_format_options max_delay=0 `
C:\Users\djcim\Videos\FFmpeg\FFmpeg%02d.ts
1
Nimble