Eu tenho extraído vídeos de filmadoras antigas da minha câmera Sony Digital8 de fitas Hi8. O software Sony cria arquivos AVI que o ffprobe detecta como:
[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
Se eu converter o arquivo para mpg usando:-target ntsc-dvd -b:v 9M -q:a 2 -q:v 2 -channel_layout stereo
Em seguida, converta-o para H.265 MP4 usando:-c:v libx265 -crf 27 -preset slow -c:a aac -b:a 128k -ac 2
O arquivo resultante funciona no aplicativo Windows Media e, mais importante, no Plex. No entanto, se eu converter DVVideo AVI diretamente para H.265, o aplicativo Windows Media me informará que é um codec não suportado e o Plex pensa que está reproduzindo, mas não tem vídeo ou áudio.
Eu tentei com todos esses argumentos diferentes converter diretamente de AVI para H.265. Observe que meu laptop possui chipsets Intel e nVidia, por isso tentei hevc_qsv e 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
O resto da linha de comando foi o mesmo para cada tentativa:ffmpeg.exe -i ".\Input.avi" -ss 00:00:06.966 -to 00:20:04.766 <args from a line above> "X:\Output.mp4"
Aqui está a saída do ffprobe para um mp4 resultante convertido de mpeg que funciona:
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
E aqui está um arquivo mp4 resultante convertido de avi que não funciona:
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]
Uma diferença clara é que o vídeo do arquivo funcional
hevc (Main) (hev1 / 0x31766568), yuv420p(tv, progressive)
é
hevc (Rext) (hev1 / 0x31766568), yuv444p(tv, bottom coded first (swapped))
.
Da mesma forma, o áudio do bom é
ac3 (ac-3 / 0x332D6361), 48000 Hz, stereo, fltp, 448 kb/s (default)
e do ruim é
pcm_s16le (ipcm / 0x6D637069), 32000 Hz, stereo, s16, 1024 kb/s (default)
.
Não entendo o ffmpeg ou o Plex o suficiente para saber qual deles pode ser um problema ou como corrigi-lo.
Observe que todos os arquivos serão reproduzidos no VLC porque ele irá ingerir praticamente qualquer coisa e reproduzi-lo, mas eu realmente gostaria de descobrir como fazê-los funcionar no Plex sem ter que converter para MPEG compatível com DVD e depois para H.265, porque isso certamente degradaria a qualidade até certo ponto.
A solução é alterar o formato do pixel para
yuv420p
.O Plex reproduzirá o vídeo nesse formato e funciona com áudio aac ou ac3.
A linha de comando final que usei na minha primeira tentativa bem-sucedida foi:
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"
Não acredito que o uso do codec Intel seja importante neste caso. Eu acredito que
-c:v hevc_nvenc
ou-c:v libx265
funcionaria da mesma forma.(@Gyan Embora eu tenha descoberto a solução antes de ver seu comentário, isso provavelmente teria resolvido o problema, então se você escrever como resposta, eu aceitarei.)
Noto que os parâmetros HEVC são ligeiramente diferentes. Mas eu começaria pelo áudio: ac3 é uma boa aposta. Você também pode tentar excluir totalmente o áudio para descartar isso e apenas investigar qual fluxo de vídeo é preferido.