使用 ffmpeg 进行 h.265 编码,视频无法正常播放

h.265 encoding with ffmpeg, video not playing correctly

我有一个 h.264 视频,我想使用 FFmpeg 编码为 h.265:

ffmpeg.exe -i h264source.mkv -vcodec libx265 -preset slower -threads 0 -crf 24 -an h265output.mkv

源 h.264 视频是 RTMP 流的录制。在某个时刻,视频停止移动 3 秒。这是因为原始 RTMP 流的连接问题。 当然,生成的 h.265 视频也会在同一点停止移动 3 秒。但是除了h.264视频,h.265视频的画面并没有冻结只有3秒,而是一直冻结到视频结束。

我正在使用 VLCplayer 3.0.8 播放 h.265 视频,它显示以下消息:

avcodec: Using D3D11VA (NVIDIA GeForce GT 1030, vendor 10de(NVIDIA), device 1d01, revision a1) for hardware decoding
avcodec error: hardware acceleration picture allocation failed
avcodec error: hardware acceleration picture allocation failed
avcodec error: hardware acceleration picture allocation failed
avcodec error: avcodec_send_packet critical error

当我在 VLCplayer 中禁用硬件加速时,h.265 视频播放正常。

接下来我使用 HandBrake 1.3.0 将 h.264 编码为 h.265,生成的 h.265 视频在启用硬件加速的 VLCplayer 中也能正常工作。

所以我的问题是: 为什么 h.264 和 h.265-handbrake-videos 在 VLCplayer 中播放正常,但在 h.265-ffmpeg 视频中播放不正常?

当我将 h.264 编码为 huffyuv,然后使用 FFmpeg 编码为 h.265 时,生成的 h.265 视频也可以正常工作:

ffmpeg.exe -i h264source.mkv -vcodec huffyuv -an huffyuv.mkv
ffmpeg.exe -i huffyuv.mkv -vcodec libx265 -preset slower -threads 0 -crf 24 -an h265output.mkv

我正在使用 Zeranoe 构建的 windows,ffmpeg-4.2.2-win64-static。

C:\ffmpeg>ffmpeg.exe -loglevel verbose -i h264source.mkv -vcodec libx265 -preset slower -threads 0 -crf 24 -an h265output.mkv
ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 9.2.1 (GCC) 20200122
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
[h264 @ 000001e8dc09d6c0] Reinit context to 864x480, pix_fmt: yuv420p
Input #0, matroska,webm, from 'h264source.mkv':
  Metadata:
    COMPATIBLE_BRANDS: isomiso2avc1mp41
    MAJOR_BRAND     : isom
    MINOR_VERSION   : 512
    ENCODER         : Lavf58.29.100
  Duration: 00:01:55.67, start: 0.000000, bitrate: 958 kb/s
    Stream #0:0: Video: h264 (Constrained Baseline), 1 reference frame, yuv420p(progressive, left), 852x480 (864x480) [SAR 1:1 DAR 71:40], 30 fps, 30 tbr, 1k tbn, 60 tbc (default)
    Metadata:
      ENCODER         : Lavc58.54.100 libx264
      DURATION        : 00:01:55.666000000
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> hevc (libx265))
Press [q] to stop, [?] for help
[h264 @ 000001e8dc77b080] Reinit context to 864x480, pix_fmt: yuv420p
[graph 0 input from stream 0:0 @ 000001e8dd38ee40] w:852 h:480 pixfmt:yuv420p tb:1/1000 fr:30/1 sar:1/1 sws_param:flags=2
x265 [info]: HEVC encoder version 3.2+35-acc5d16999e2
x265 [info]: build info [Windows][GCC 9.2.1][64 bit] 8bit+10bit
x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
x265 [info]: Main profile, Level-3 (Main tier)
x265 [info]: Thread pool created using 16 threads
x265 [info]: Slices                              : 1
x265 [info]: frame threads / pool features       : 4 / wpp(8 rows)
x265 [info]: Coding QT: max CU size, min CU size : 64 / 8
x265 [info]: Residual QT: max TU size, max depth : 32 / 3 inter / 3 intra
x265 [info]: ME / range / subpel / merge         : star / 57 / 4 / 4
x265 [info]: Keyframe min / max / scenecut / bias  : 25 / 250 / 40 / 5.00
x265 [info]: Lookahead / bframes / badapt        : 40 / 8 / 2
x265 [info]: b-pyramid / weightp / weightb       : 1 / 1 / 1
x265 [info]: References / ref-limit  cu / depth  : 5 / off / on
x265 [info]: AQ: mode / str / qg-size / cu-tree  : 2 / 1.0 / 32 / 1
x265 [info]: Rate Control / qCompress            : CRF-24.0 / 0.60
x265 [info]: tools: rect amp limit-modes rd=6 psy-rd=2.00 rdoq=2 psy-rdoq=1.00
x265 [info]: tools: rskip limit-tu=4 signhide tmvp b-intra
x265 [info]: tools: strong-intra-smoothing deblock sao
Output #0, matroska, to 'h265output.mkv':
  Metadata:
    COMPATIBLE_BRANDS: isomiso2avc1mp41
    MAJOR_BRAND     : isom
    MINOR_VERSION   : 512
    encoder         : Lavf58.29.100
    Stream #0:0: Video: hevc (libx265), 1 reference frame, yuv420p(left), 852x480 [SAR 1:1 DAR 71:40], q=2-31, 30 fps, 1k tbn, 30 tbc (default)
    Metadata:
      DURATION        : 00:01:55.666000000
      encoder         : Lavc58.54.100 libx265
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
No more output streams to write to, finishing
frame= 3178 fps= 14 q=-0.0 Lsize=    5105kB time=00:01:55.56 bitrate= 361.9kbits/s speed=0.506x
video:5080kB audio:0kB subtitle:0kB other streams:0kB global headers:2kB muxing overhead: 0.492293%
Input file #0 (h264source.mkv):
  Input stream #0:0 (video): 3178 packets read (13837009 bytes); 3178 frames decoded;
  Total: 3178 packets (13837009 bytes) demuxed
Output file #0 (h265output.mkv):
  Output stream #0:0 (video): 3178 frames encoded; 3178 packets muxed (5201780 bytes);
  Total: 3178 packets (5201780 bytes) muxed
[AVIOContext @ 000001e8dc77af40] Statistics: 8 seeks, 40 writeouts
x265 [info]: frame I:     13, Avg QP:18.10  kb/s: 6779.10
x265 [info]: frame P:   1754, Avg QP:22.52  kb/s: 619.00
x265 [info]: frame B:   1411, Avg QP:31.19  kb/s: 50.69
x265 [info]: Weighted P-Frames: Y:0.0% UV:0.0%
x265 [info]: Weighted B-Frames: Y:0.0% UV:0.0%
x265 [info]: consecutive B-frames: 67.4% 8.3% 8.6% 10.9% 2.7% 2.0% 0.2% 0.0% 0.0%

encoded 3178 frames in 228.50s (13.91 fps), 391.87 kb/s, Avg QP:26.35
[AVIOContext @ 000001e8dc0936c0] Statistics: 13860805 bytes read, 0 seeks

有什么建议吗?

正如Jay在评论中所说,它与强制关键帧有关。 他的 link https://superuser.com/questions/908280/what-is-the-correct-way-to-fix-keyframes-in-ffmpeg-for-dash 帮我解决了这个问题。

我希望有同样问题的其他人能找到这个post来解决这个问题...