# 起因

前几天在某宝上购入了一台号称支持 mkv 格式的 bdp s485 , 但是在尝试播放 MyGO 时提示不兼容的视频文件,于是就光速退款了。

退款成功后遂又购入了一台号称是无拆无修的 PS3 。

兜兜转转又回到起点了。

当然这只是其中一个原因,另外几个原因可能会放到另一篇文章中。

# h264_mediacodec

众所周知,2006 年诞生,2012 年出薄机,2017 年停产,2023 年仍然提供更新的 PS3 是不支持 2002 年出现的上古 mkv 格式的视频的 (全恼)

于是就需要进行视频转码。

起先我是准备用 ffmpeg 的。

但是由于众所周知的原因,它转换起来很慢,而且视频是 h265 格式的,而 ps3 只支持 h264 格式的视频 (恼) 再加上万恶的 libx264

于是就更慢了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[libx264 @ 0xb4000070300d1c00] using SAR=1/1
[libx264 @ 0xb4000070300d1c00] using cpu capabilities: ARMv8 NEON
[libx264 @ 0xb4000070300d1c00] profile High 10, level 4.1, 4:2:0, 10-bit
[libx264 @ 0xb4000070300d1c00] 264 - core 164 - H.264/MPEG-4 AVC codec - Copyleft 2003-2022 - http://www.videolan.org/x264.html - options: cabac=1 ref=4 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=8 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=2 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=3 weightb=1 open_gop=0 weightp=2 keyint=24 keyint_min=2 scenecut=40 intra_refresh=0 rc_lookahead=24 rc=crf mbtree=1 crf=15.0 qcomp=0.60 qpmin=0 qpmax=81 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to '[PoM&WM]BanG Dream!It's MyGO!!!!![01][Webrip][1080p][CHS_JAP][x265 HEVC-10bit AAC] [F2FD5CDD].mkv.mp4':
Metadata:
encoder : Lavf60.16.100 Stream #0:0: Video: h264 (avc1 / 0x31637661), yuv420p10le(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 24 fps, 12288 tbn (default) Metadata: BPS-eng : 3007054 DURATION-eng : 00:23:50.054000000 NUMBER_OF_FRAMES-eng: 34287 NUMBER_OF_BYTES-eng: 537531258 _STATISTICS_WRITING_APP-eng: mkvmerge v48.0.0 ('Fortress Around Your Heart') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2023-10-22 07:46:20 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES encoder : Lavc60.31.102 libx264 Side data: cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
Stream #0:1(jpn): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 320 kb/s (default)
Metadata:
BPS-eng : 128000
DURATION-eng : 00:23:50.117000000
NUMBER_OF_FRAMES-eng: 61590
NUMBER_OF_BYTES-eng: 22881873
_STATISTICS_WRITING_APP-eng: mkvmerge v48.0.0 ('Fortress Around Your Heart') 64-bit
_STATISTICS_WRITING_DATE_UTC-eng: 2023-10-22 07:46:20
_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES encoder : Lavc60.31.102 aac
frame= 213 fps=2.0 q=32.0 size= 14592kB time=00:00:10.98 bitrate=10880.8kbits/s speed=0.104x

后来知道了有一个安卓解码器 h264_mediacodec ,于是就失踪该解码器进行转换。speed 来到了 2.x

也就是一个 20 分钟的视频转换完成需要进行 20 分钟。

本来这也没什么,慢慢等就行了。

结果查看转换完成的视频才发现视频大小变成了原来的五分之一且无法正常播放。

于是就临时借了一台电脑去转换。

# h264_nvenc

然后因为在 linux 上写 shell 习惯了到 windows 平台反而无所适从,于是就装了个 cygwin。

然后用 cygwin 运行编写的 shell 脚本发现:

  • cpu 吃满,gpu 划水
  • 速度还是 2.x

大哥这可是 12900k 啊 (全恼)

于是就打算使用 h264_nvenc 来进行解码,结果发现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ffmpeg version 6.1.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 12.2.0 (Rev10, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-static --pkg-config=pkgconf --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-dxva2 --enable-d3d11va --enable-libvpl --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband
libavutil 58. 29.100 / 58. 29.100
libavcodec 60. 31.102 / 60. 31.102
libavformat 60. 16.100 / 60. 16.100
libavdevice 60. 3.100 / 60. 3.100
libavfilter 9. 12.100 / 9. 12.100
libswscale 7. 5.100 / 7. 5.100
libswresample 4. 12.100 / 4. 12.100
libpostproc 57. 3.100 / 57. 3.100
[h264 @ 000001cccc12fb80] Invalid NAL unit 0, skipping.
[h264 @ 000001cccc12fb80] Error decoding the extradata
NUMBER_OF_FRAMES NUMBER_OF_BYTES
[h264_mp4toannexb @ 000001cccc1147c0] Global extradata truncated, corrupted stream or invalid MP4/AVCC bitstream
[vist#0:0/h264 @ 000001cccc77ed40] Error while opening decoder: Invalid data found when processing input
[vost#0:0/libx264 @ 000001ccccb70cc0] Error initializing a simple filtergraph
Error opening output file 1.mp4.
Error opening output files: Invalid data found when processing input

我真服了明明 vlc 还可以正常播放的 (全恼)

于是就打算从头编译 ffmpeg

然后就想到了两个方案:

安装 cuda 和 visual studio 2022 ,然后利用 vs2022 编译 ffmpeg

结果就是 cuda 装到一半要么安装失败要么蓝屏 (全恼)

在 linux 虚拟机里安装 mingw 和 cuda ,然后跨平台编译 windows 版本。

咱就不提装个 cuda 需要预留十个 g 的空间和极慢的安装速度了;

首先遇到的报错就是需要启用 --enable-nonfree。好,我启用了;

然后发现 error: cuda requested, but not all dependencies are sayisfied: ffnvcodec,但是我明明已经安装了;

添加了 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig 还是没用;

添加了 --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib 也还是识别不到

于是就放弃了 (悲)

# cpu 终于不内耗了

后来在这个回答中找到了 ShanaEncoder 这个软件。

然后就发现自从用了 ShanaEncoder 后转码速度快到飞起, GPU 终于不再全程划水了 (喜)

实测 3090Ti 转码一个 25 分钟的 h265 mkv 视频仅需要 1 分钟 (大喜)

附:我自己用的配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!-- ShanaEncoder -->
<Settings>
<inputparamBox/>
<prefixtextBox>[SHANA]</prefixtextBox>
<extensiontextBox/>
<filterparamBoxV/>
<filterparamBoxA/>
<encparamBox> -f mp4 -c:v h264_nvenc -c:a copy -sn -cq 15 -profile:v baseline -level auto -preset p4 -tune:v hq</encparamBox>
<x264optsBox/>
<substyle>Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding Style: Default,,22,&H00FFFFFF,&H0000FFFF,&H00000000,&H80000000,-1,0,0,0,100,100,0,0,1,2.5,2.5,2,10,10,20,1</substyle>
<fontnameSE/>
<Logo>
<logochk>False</logochk>
<logopath/>
<logoalign>7</logoalign>
<logox>5</logox>
<logoy>5</logoy>
<logow>0</logow>
<logoh>0</logoh>
<logos>1</logos>
<logosd>1</logosd>
<logoe>9</logoe>
<logoed>1</logoed>
<logoschk>True</logoschk>
<logoechk>True</logoechk>
</Logo>
</Settings>

更新于 阅读次数