ffmpegでnvencのrc-lookahead使うとクラッシュする件

はじめに

ffmpegでnvencが使えれば高速で高画質(turing以降)なのでやってみましたが、

「-rc-lookahead」が1以上だとコアダンプが何故か起きます。

ffmpeg -hide_banner -y -vsync 1 -init_hw_device cuda -hwaccel_output_format cuda -i ./sample.mp4 -c:v h264_nvenc -b:v 4M -bufsize 24M -an  -rc-lookahead 30 -vf framerate=30,format=nv12,hwupload,scale_cuda=-2:480:interp_algo=lanczos output.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from './sample.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41isomavc1
    creation_time   : 2020-08-27T11:22:24.000000Z
  Duration: 00:00:37.77, start: 0.000000, bitrate: 4136 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080, 4133 kb/s, 29.97 fps, 29.97 tbr, 30k tbn (default)
    Metadata:
      creation_time   : 2020-08-27T11:22:24.000000Z
      handler_name    : L-SMASH Video Handler
      vendor_id       : [0][0][0][0]
      encoder         : AVC Coding
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (h264_nvenc))
Press [q] to stop, [?] for help
[Parsed_framerate_0 @ 0x55f552bf1a40] time base:1/30000 -> 1/30000 exact:1
[Parsed_framerate_0 @ 0x55f552bf1a40] fps -> fps:30/1 scene score:8.200000 interpolate start:15 end:240
Output #0, mp4, to 'output.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41isomavc1
    encoder         : Lavf59.8.100
  Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), cuda(tv, bt709, progressive), 854x480, q=2-31, 4000 kb/s, 30 fps, 15360 tbn (default)
    Metadata:
      creation_time   : 2020-08-27T11:22:24.000000Z
      handler_name    : L-SMASH Video Handler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc59.12.100 h264_nvenc
    Side data:
      cpb: bitrate max/min/avg: 0/0/4000000 buffer size: 24000000 vbv_delay: N/A
Segmentation fault (core dumped)      0kB time=00:00:00.00 bitrate=N/A speed=   0x 

解決策

入力動画に付属しているnaul情報が邪魔らしいので消してからやるとうまくいきます。

(naul情報はh264しかついていないので、それ以外の動画を入力するとバグります。)

ffmpeg -i ./sample.mp4 -c:v copy -bsf:v 'filter_units=pass_types=1-5' ./output_remove_naul.mp4
ffmpeg -hide_banner -y -vsync 1 -init_hw_device cuda -hwaccel_output_format cuda -i ./output_remove_naul.mp4 -c:v h264_nvenc -b:v 4M -bufsize 24M -an  -rc-lookahead 30 -vf framerate=30,format=nv12,hwupload,scale_cuda=-2:480:interp_algo=lanczos   ./output.mp4

パイプを用いれば、無茶苦茶だけれど一応ファイル書き出しせずにもできる

ffmpeg -loglevel quiet -analyzeduration 30M -probesize 100M -i ./sample.mp4 -c:v copy -bsf:v 'filter_units=pass_types=1-5' -f matroska pipe: | ffmpeg -hide_banner -y -vsync 1  -init_hw_device cuda -hwaccel_output_format cuda -i pipe:  -g 180 -c:v h264_nvenc -b:v 4M -bufsize 24M -an -preset slow -profile:v high -bf 4 -b_ref_mode 2  -temporal-aq 1 -rc-lookahead 30 -filter_complex framerate=30,format=nv12,hwupload,scale_cuda=-2:480:interp_algo=lanczos   output.mp4

おわりに

こんなのわからないし、naulを一旦外すために、デコードする必要があるため遅い。

デコードした動画をファイルに保存せずそのまま、GPU側に渡す方法は無いだろうか?

(修正されれば解決する話ではあるが、ffmpeg・nvidiaどっちの問題なのだろうか?)