将H265编码为hvc1编解码器

Sli*_*169 4 ffmpeg

这是我的源文件的信息: 在此输入图像描述

我想保持音频质量,只是编码视频轨道,所以我使用这个命令:

ffmpeg -i INPUT -c:a copy -c:v libx265 video-h265.mp4
Run Code Online (Sandbox Code Playgroud)

这是结果: 在此输入图像描述

但视频轨道的编解码器是hev1.我想要它是hvc1

Sus*_*ver 17

使用最新版本ffmpeg(N-87630-ge9f9175-tessus或构建HEAD版本),您可以使用mac编码为macOS High Sierra Quicktime所需的MP4版本-tag:v hvc1.

如果您有一个hev1基于mp4的mp4并且您需要容器,hvc1并且您不想重新编码它:

ffmpeg -i input-hev1.mp4 -c:v copy -tag:v hvc1 -c:a copy output-hvc1.mp4
Run Code Online (Sandbox Code Playgroud)

使用ffprobe确认更改:

从:

~~~~
Stream #0:0(eng): Video: hevc (Main) (hev1 / 0x31766568), yuv420p(tv, progressive), 720x404, 164 kb/s, 29.97 fps,
~~~~
Run Code Online (Sandbox Code Playgroud)

至:

~~~~
Stream #0:0(eng): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, progressive), 720x404, 164 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 29.97 tbc (default)
~~~~
Run Code Online (Sandbox Code Playgroud)

如果你有一个较旧 avc1的mp4,你需要重新编码它.

ffprobe例子(avc1):

Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 960x540 [SAR 1:1 DAR 16:9], 2778 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 180k tbc (default)
Run Code Online (Sandbox Code Playgroud)

编码示例:

ffmpeg 
    -i input.mp4 \
    -c:v libx265 \
    -preset slow \
    -vf scale="720:trunc(ow/a/2)*2" \
    -crf 28 \
    -tag:v hvc1 \
    -c:a aac -b:a 44100 \
    output-hvc1.mp4
Run Code Online (Sandbox Code Playgroud)

关键是-tag:v hvc1,如果没有这个,你将得到一个hev1基于Quick的10.4+(High Sierra)无法打开的基于容器的容器.


小智 7

'hev1'/'hvc1'是用于表示容器mp4文件中流的不同打包的代码点.编码本身没有变化.可以在两种模式之间往返.试试mp4box:

mp4box -raw 1 file.mp4 
Run Code Online (Sandbox Code Playgroud)

这会将流提取到原始HEVC文件中.

mp4box -add file_track1.hvc output.mp4
Run Code Online (Sandbox Code Playgroud)

如果可以,这将使用hvc1重新导入流.

  • @cconcolato这是否可以直接在没有mp4box后编码步骤的ffmpeg编码命令中? (3认同)

小智 5

添加-tag:v hvc1为 @SushiHangover 的答案并-bsf:v hevc_mp4toannexb添加到ffmpeg命令(3.4 及更高版本)。这将创建一个与 QuickTime 兼容的 mov 文件。

ffmpeg -i input-hev1.mp4 -c:v copy -tag:v hvc1 -bsf:v hevc_mp4toannexb -c:a copy output-hvc1.mov
Run Code Online (Sandbox Code Playgroud)