DanielRieken
DanielRieken

Reputation: 61

h.265 encoding with ffmpeg, video not playing correctly

I got a h.264 video I would like to encode to h.265 using FFmpeg:

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

The source h.264 video is a recording of a RTMP-stream. At some point the video stops moving for 3 seconds. This is because of connection-issues of the original RTMP-stream. Of course the resulting h.265 video also stops moving for 3 seconds at the same point. But other than the h.264 video, the picture of the h.265 video is not frozen for only 3 seconds, it is frozen until the end of the video.

I am using VLCplayer 3.0.8 for playback and it shows the following messages for the h.265 video:

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

When I disable hardware acceleration in VLCplayer the playback of the h.265 video works fine.

Next I encoded the h.264 to h.265 using HandBrake 1.3.0 and the resulting h.265 video also works fine in VLCplayer with hardware acceleration enabled.

So my question is: Why is the playback of the h.264 and the h.265-handbrake-videos working fine in VLCplayer but not the h.265-ffmpeg video?

When I encode the h.264 to huffyuv and then to h.265 using FFmpeg, the resulting h.265-video also works fine:

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

I am using the windows build by Zeranoe, 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

Any advices?

Upvotes: 3

Views: 8872

Answers (1)

DanielRieken
DanielRieken

Reputation: 61

As Jay said in the comments, it has to do with forcing key frames. His link https://superuser.com/questions/908280/what-is-the-correct-way-to-fix-keyframes-in-ffmpeg-for-dash solved the problem for me.

I hope other people with the same problem will find this post to also fix the problem...

Upvotes: 3

Related Questions