кодирование h.265 с помощью ffmpeg, видео воспроизводится неправильно - PullRequest
1 голос
/ 11 марта 2020

Я получил видео h.264, которое я хотел бы кодировать в h.265, используя FFmpeg:

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 работает нормально.

Затем я закодировал с h.264 по h.265 с использованием HandBrake 1.3.0 и полученного видео h.265 также отлично работает в VLCplayer с включенным аппаратным ускорением.

Итак, мой вопрос: почему воспроизведение h.264 и h.265-handbrake-videos нормально работает в VLCplayer, но не видео h.265-ffmpeg?

Когда я кодирую h.264 в huffyuv, а затем в h.265, используя FFmpeg, получается 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

Я использую сборку windows от Zeranoe, ffmpeg-4.2.2-win64-stati c.

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

Любой советы?

1 Ответ

1 голос
/ 11 марта 2020

Как сказал Джей в комментариях, это связано с форсированием ключевых кадров. Его ссылка https://superuser.com/questions/908280/what-is-the-correct-way-to-fix-keyframes-in-ffmpeg-for-dash решила проблему для меня.

Я надеюсь, что другие люди с такой же проблемой найдут этот пост, чтобы также решить проблему ...

...