使用 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来解决这个问题...
我有一个 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来解决这个问题...