FFmpeg + NVENC-Codierung: seltsames Seitenverhältnis

884

Mein Quellvideo ist MPEG-2, 720x576, DAR = 16: 9. Mit FFmpeg und dem h264_nvenc-Encoder konvertiere ich ihn in H.264. Das Problem: Die Ausgabe-AR ist seltsam / falsch / inkosistent. Befehlszeile:

>ffmpeg -i "d:\in.mpg" -aspect 16:9 -c:v h264_nvenc -c:a copy -t 15 "d:\out.mp4" ffmpeg version N-83280-gcba4f0e Copyright (c) 2000-2017 the FFmpeg developers built with gcc 5.4.0 (GCC) configuration: --disable-static --enable-shared --enable-gpl --enable-version3 --enable-cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib libavutil 55. 45.100 / 55. 45.100 libavcodec 57. 75.100 / 57. 75.100 libavformat 57. 65.100 / 57. 65.100 libavdevice 57. 2.100 / 57. 2.100 libavfilter 6. 71.100 / 6. 71.100 libswscale 4. 3.101 / 4. 3.101 libswresample 2. 4.100 / 2. 4.100 libpostproc 54. 2.100 / 54. 2.100 [mpeg @ 000000000223ab20] start time for stream 0 is not set in estimate_timings_from_pts Input #0, mpeg, from 'd:\in.mpg': Duration: 02:59:33.92, start: 0.500000, bitrate: 3401 kb/s Stream #0:0[0x1bf]: Data: dvd_nav_packet Stream #0:1[0x1c0]: Audio: mp2, 48000 Hz, stereo, s16p, 192 kb/s Stream #0:2[0x1e0]: Video: mpeg2video (Main), yuv420p(tv, top first), 720x576 [SAR 64:45 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc File 'd:\out.mp4' already exists. Overwrite ? [y/N] y Output #0, mp4, to 'd:\out.mp4': Metadata: encoder : Lavf57.65.100 Stream #0:0: Video: h264 (h264_nvenc) (Main) ([33][0][0][0] / 0x0021), yuv420p, 720x576 [SAR 64:45 DAR 16:9], q=-1--1, 2000 kb/s, 25 fps, 12800 tbn, 25 tbc Metadata: encoder : Lavc57.75.100 h264_nvenc Side data: cpb: bitrate max/min/avg: 0/0/2000000 buffer size: 4000000 vbv_delay: -1 Stream #0:1: Audio: mp2 (i[0][0][0] / 0x0069), 48000 Hz, stereo, s16p, 192 kb/s Stream mapping: Stream #0:2 -> #0:0 (mpeg2video (native) -> h264 (h264_nvenc)) Stream #0:1 -> #0:1 (copy) Press [q] to stop, [?] for help frame= 375 fps=0.0 q=22.0 Lsize= 4122kB time=00:00:14.97 bitrate=2254.9kbits/s dup=19 drop=0 speed=28.9x video:3762kB audio:352kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.208697% 

Für den Ausgabevideostrom steht "[SAR 64:45 DAR 16: 9]". Wenn ich jedoch das Ergebnis out.mp4 analysiere, heißt es:

Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 720x576 [SAR 16:11 DAR 20:11], 2054 kb/s, SAR 64:45 DAR 16:9, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default) 

Die Werte nach den eckigen Klammern sind korrekt, aber innerhalb der Klammern weiß ich nicht, warum diese DAR / SAR-Werte verwendet werden. Je nachdem, welche Werte vom Player später verwendet werden (Container oder Stream AR), kann das Ergebnis falsch sein. Es spielt keine Rolle, ob "-aspect 16: 9" verwendet wird oder nicht.

Wenn ich libx264 anstelle von h264_nvenc verwende, ist die Ausgabe-AR korrekt. Ich denke, es ist ein Encoder-Problem. Ich habe den neuesten Build verwendet, aber zuvor habe ich die offiziellen Versionen 3.2 und 3.2.2 verwendet

Ich bin überrascht, dass ich das gleiche Problem bisher nirgends gefunden habe. Bevor ich dies als Fehler meldet, möchte ich Sie um Ihre Meinung bitten, falls ich etwas falsch mache. Vielen Dank.

0
Hat sich das Verhalten bei älteren Builds (wie den Release-Versionen) geändert? LordNeckbeard vor 7 Jahren 0
Nein, deshalb habe ich den neuesten Build ausprobiert, um zu sehen, ob er inzwischen behoben wurde. vor 7 Jahren 0
Wenn Sie "-vf setdar = 16: 9" hinzufügen, wird das Problem dadurch vermieden? Gyan vor 7 Jahren 0
Danke für den Tipp. Nein, das Ergebnis ändert sich nicht. Selbst wenn ich "-aspect 4: 3" spezifiziere, ist der Stream-DAR 20: 11. Wenn ich jedoch "-vf setdar = 4: 3" eingebe, lautet der resultierende Stream-DAR 15:11. Wahrscheinlich berücksichtigt es die Eingabe-DAR, aber ich denke, wenn 16: 9 die explizite Ziel-DAR ist, darf es keine Abweichung davon geben. vor 7 Jahren 0
Interessant: Wenn ich den Skalenfilter voranstellen, wird das AR-Set richtig eingestellt. Dies funktioniert aber nur, wenn ich die Größe wirklich verändere, dh wenn ich die Zielgröße gleich der Eingangsgröße 720x576 einstelle, hat das Einstellen des DAR keinen Effekt. vor 7 Jahren 0
Entschuldigung, ich wieder. Ich habe verschiedene Kombinationen von Eingangsgrößen und Ausgangsgrößen mit dem Skalenfilter ausprobiert, wobei AR immer auf 16: 9 eingestellt wurde. Ergebnis: Die AR ist immer richtig eingestellt - es sei denn, die Ausgabegröße beträgt 720: 576. (Vielleicht wird dieses spezielle "PAL-Format" anders behandelt. Ich werde versuchen, den Quellcode für dieses Problem zu finden ...) vor 7 Jahren 0
Es scheint der `av_reduce`-Aufruf in` libavcodec / nvenc.c` zu sein Gyan vor 7 Jahren 0
Vielen Dank. Ich habe den Anruf getestet. Die Eingabewerte sind 720 * 64 = 46080 für Breite und 576x45 = 25920 für die Höhe (64 und 45 sind die SAR-Werte). Ausgabewerte sind 16 und 9. Dieser Teil wird also korrekt in den Drehgeber eingespeist. Es scheint, dass der Encoder diese PAL-Werte speziell behandelt. Es gibt ein Ticket bei trac.ffmpeg.org darüber, also folge ich ihm. vor 7 Jahren 0

0 Antworten auf die Frage