我一直在从我的索尼 Digital8 相机的 Hi8 磁带中取出旧摄像机视频。索尼软件创建的 AVI 文件被 ffprobe 检测为:
[avi @ 000001dec87682c0] ODML index invalid
Last message repeated 1 times
Input #0, avi, from '.\20240717154604.avi':
Duration: 01:57:00.11, start: 0.000000, bitrate: 29803 kb/s
Stream #0:0: Video: dvvideo (dvsd / 0x64737664), yuv411p, 720x480 [SAR 8:9 DAR 4:3], 28771 kb/s, 29.97 fps, 29.97 tbr, 29.97 tbn
Stream #0:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 32000 Hz, 2 channels, s16, 1024 kb/s
如果我使用以下命令将文件转换为 mpg:-target ntsc-dvd -b:v 9M -q:a 2 -q:v 2 -channel_layout stereo
然后使用以下方法将其转换为 H.265 MP4:-c:v libx265 -crf 27 -preset slow -c:a aac -b:a 128k -ac 2
生成的文件可以在 Windows Media 应用程序中使用,更重要的是,可以在 Plex 中使用。但是,如果我将 DVVideo AVI 直接转换为 H.265,Windows Media 应用程序会告诉我这是一个不受支持的编解码器,而 Plex 认为它正在播放它,但没有视频或音频。
我尝试使用所有这些不同的参数将 AVI 直接转换为 H.265。请注意,我的笔记本电脑同时配有 Intel 和 nVidia 芯片组,因此我尝试了 hevc_qsv 和 hevc_nvenc。
-c:v libx265 -crf 27 -preset slow -c:a aac -b:a 128k -ac 2
-map 0 -c copy -c:v hevc_qsv -c:a aac
-c copy -c:v hevc_nvenc
-c copy -c:v hevc_nvenc -preset slow -level 4.1 -f mp4
-c:v hevc_nvenc -preset slow -level 4.1 -f mp4
每次尝试时,命令行的其余部分都是相同的:ffmpeg.exe -i ".\Input.avi" -ss 00:00:06.966 -to 00:20:04.766 <args from a line above> "X:\Output.mp4"
下面是从 mpeg 转换而来的 mp4 的 ffprobe 输出:
PS X:\> .\ffmpeg\bin\ffprobe.exe -hide_banner '.\Hiner Christmas 1997 - nVidia mpg copy preset slow level 4.1.mp4'
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\Hiner Christmas 1997 - nVidia mpg copy preset slow level 4.1.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomdby1iso2mp41
encoder : Lavf60.16.100
Duration: 00:19:58.01, start: 0.000000, bitrate: 2488 kb/s
Stream #0:0[0x1](und): Video: hevc (Main) (hev1 / 0x31766568), yuv420p(tv, progressive), 720x480 [SAR 8:9 DAR 4:3], 2035 kb/s, 29.97 fps, 29.97 tbr, 30k tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : Lavc60.31.102 hevc_nvenc
Stream #0:1[0x2](und): Audio: ac3 (ac-3 / 0x332D6361), 48000 Hz, stereo, fltp, 448 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
Side data:
audio service type: main
下面是从 avi 转换而来的 mp4 文件,但它不起作用:
PS X:\> .\ffmpeg\bin\ffprobe.exe -hide_banner '.\Hiner Christmas 1997 - nVidia avi copy preset slow level 4.1.mp4'
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\Hiner Christmas 1997 - nVidia avi copy preset slow level 4.1.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
encoder : Lavf60.16.100
Duration: 00:19:57.81, start: 0.000000, bitrate: 3064 kb/s
Stream #0:0[0x1](und): Video: hevc (Rext) (hev1 / 0x31766568), yuv444p(tv, bottom coded first (swapped)), 720x480 [SAR 8:9 DAR 4:3], 2033 kb/s, 29.97 fps, 29.97 tbr, 30k tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : Lavc60.31.102 hevc_nvenc
Stream #0:1[0x2](und): Audio: pcm_s16le (ipcm / 0x6D637069), 32000 Hz, stereo, s16, 1024 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
一个明显的区别是,工作文件的视频是
hevc (Main) (hev1 / 0x31766568), yuv420p(tv, progressive)
,而坏文件的视频是
hevc (Rext) (hev1 / 0x31766568), yuv444p(tv, bottom coded first (swapped))
。
同样,好的音频是
ac3 (ac-3 / 0x332D6361), 48000 Hz, stereo, fltp, 448 kb/s (default)
,坏的音频是
pcm_s16le (ipcm / 0x6D637069), 32000 Hz, stereo, s16, 1024 kb/s (default)
。
我不太了解 ffmpeg 或 Plex,不知道其中哪一个可能是问题或者如何解决它。
请注意,所有文件都可以在 VLC 中播放,因为它可以提取任何内容并播放,但我真的很想弄清楚如何让这些文件在 Plex 上运行,而不必转换为 DVD 兼容 MPEG,然后再转换为 H.265,因为这肯定会在一定程度上降低质量。
解决方法是将像素格式更改为
yuv420p
。Plex 将以该格式播放视频,并可与 aac 或 ac3 音频配合使用。
我第一次成功尝试使用的最终命令行是:
ffmpeg.exe -hide_banner -i ".\Input.avi" -ss 00:00:06.966 -to 00:20:04.766 -map 0 -c copy -c:v hevc_qsv -pix_fmt yuv420p -c:a ac3 -preset slow ".\Output.mp4"
我认为在这种情况下使用英特尔编解码器无关紧要。我相信或都
-c:v hevc_nvenc
可以-c:v libx265
正常工作。(@Gyan 虽然我在看到你的评论之前就发现了修复方法,但很可能已经修复了它,所以如果你把它写成答案,我会接受它。)
我注意到 HEVC 参数略有不同。但我会从音频开始:ac3 是个不错的选择。您也可以尝试完全删除音频以排除这种情况,然后调查哪个视频流是首选。