Persivan / Eventurika-Honkai-Impact-Translation

This repository contains tools for working with .usm cinematics from Honkai Impact 3, allowing users to extract and replace video, audio, and subtitles seamlessly. Also, we are looking for patching in-game dialogues.
MIT License
5 stars 0 forks source link

FFMPEG со стандартными параметрами портит качество видео #12

Open Devyatyi9 opened 5 months ago

Devyatyi9 commented 5 months ago

$"-i \"{videoFilePath}\" -i \"{audioFilePath}\" \"{outputVideoFilePath}\" \"{outputAudioFilePath}\" -y" original m2v vs converted avi image

Devyatyi9 commented 5 months ago

Полагаю нужно получать битрейт (с помощью ffprobe) и далее указывать его для ffmpeg при конвертации в avi, но возможно ещё дело в каком-то сжатии.

Параметр битрейта для видео -b:v и для аудио -b:a. Например -b:v 2M или -b:a 128k

Devyatyi9 commented 5 months ago

Заюзал параметры:

"D:\ProjectsD\ffmpeg\bin\ffmpeg.exe" -i "C:\Users\User\Projects\Eventurika-Honkai-Impact-Translation\usm_builder_input/7.3_MainLine_CG05_JP_10000_e80755901f2f71bf5ee16c8bdb37f19b.m2v" -i "C:\Users\User\Projects\Eventurika-Honkai-Impact-Translation\usm_builder_input/7.3_MainLine_CG05_JP_10000_e80755901f2f71bf5ee16c8bdb37f19b.hca" -c:v copy "C:\Users\User\Projects\Eventurika-Honkai-Impact-Translation\usm_builder_temp/7.3_MainLine_CG05_JP_10000_e80755901f2f71bf5ee16c8bdb37f19b.avi" "C:\Users\User\Projects\Eventurika-Honkai-Impact-Translation\usm_builder_temp/7.3_MainLine_CG05_JP_10000_e80755901f2f71bf5ee16c8bdb37f19b.wav" -y

-c:v copy и это всё исправило (качество изображения) -с это codec

Вывод из терминала ``` [h264 @ 000001d7089bbd40] Stream #0: not enough frames to estimate rate; consider increasing probesize Input #0, h264, from 'C:\Users\User\Projects\Eventurika-Honkai-Impact-Translation\usm_builder_input/7.3_MainLine_CG05_JP_10000_e80755901f2f71bf5ee16c8bdb37f19b.m2v': Duration: N/A, bitrate: N/A Stream #0:0: Video: h264 (High), yuv420p(tv, smpte170m, progressive), 1280x720 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 1200k tbn Guessed Channel Layout for Input Stream #1.0 : stereo Input #1, hca, from 'C:\Users\User\Projects\Eventurika-Honkai-Impact-Translation\usm_builder_input/7.3_MainLine_CG05_JP_10000_e80755901f2f71bf5ee16c8bdb37f19b.hca': Duration: 00:00:15.10, bitrate: 96 kb/s Stream #1:0: Audio: hca, 48000 Hz, 2 channels, fltp Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #1:0 -> #0:1 (hca (native) -> mp3 (libmp3lame)) Stream #1:0 -> #1:0 (hca (native) -> pcm_s16le (native)) Press [q] to stop, [?] for help Output #0, avi, to 'C:\Users\User\Projects\Eventurika-Honkai-Impact-Translation\usm_builder_temp/7.3_MainLine_CG05_JP_10000_e80755901f2f71bf5ee16c8bdb37f19b.avi': Metadata: ISFT : Lavf59.30.100 Stream #0:0: Video: h264 (High) (H264 / 0x34363248), yuv420p(tv, smpte170m, progressive), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 25 fps, 25 tbr, 50 tbn Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, fltp Metadata: encoder : Lavc59.42.103 libmp3lame Output #1, wav, to 'C:\Users\User\Projects\Eventurika-Honkai-Impact-Translation\usm_builder_temp/7.3_MainLine_CG05_JP_10000_e80755901f2f71bf5ee16c8bdb37f19b.wav': Metadata: ISFT : Lavf59.30.100 Stream #1:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, stereo, s16, 1536 kb/s Metadata: encoder : Lavc59.42.103 pcm_s16le [avi @ 000001d7089b76c0] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly frame= 376 fps=0.0 q=-1.0 Lsize= 17518kB time=00:00:15.09 bitrate=9506.2kbits/s speed=18.4x video:17239kB audio:3069kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown ```

Правда на выходе получает вместо фиксированного, вариативный фреймрейт, но это общий фреймрейт, для видео почему-то выставлено 50фпс, и указано что оригинальный фреймрейт 25. (нужно посмотреть лог выше) Также почему-то добавляется аудио дорожка, хотя параметр копирования указан только для видео и в оригинальном видео нет звука, только в hca, возможно нужно было указывать его в конце, если это вобще влияет. Я бы понял если бы там было -c:av image Вот это кстати полезно будет прочесть, стопка коротких простых примеров

https://trac.ffmpeg.org/wiki/Encode/H.264

Devyatyi9 commented 5 months ago

tbn - временная база (метка времени per second) AVStream (аудио/видео потока), которая пришла из контейнера (взятая из входного файла, уведомление-извещение - notification)... Time Base Notification tbc - временная метка AVCodecContext используемая для кодека конкретного потока (аудио или видио) - Time Base Сorrection (или Codec,Context..?)... tbr - предполагаемая метка времени, взятая из потока в виде пользовательского значения, установленного самим юзером. Показывается для того, чтобы пользователь мог видеть - установленную частоту кадров в секунду... Time Base R(?...Rate...?) или..? To Be Record ("Будет записано", - известный термин)...

Пока что в данный момент к параметру копирования видеокодека (-c:v copy) можно добавить получение фпс m2v файла через ffprobe, перед конвертацией в avi, чтобы хотя бы фпс был корректным (с усреднённым битрейтом ещё не придумал что делать используя лишь команды ffmpeg/ffprobe (есть какие-то варианты, но там нужно пофреймово анализ делать).

Persivan commented 5 months ago

-c:v copy - используем т.к. это ускорит процесс. Но тогда появятся баги с фреймрейтом. Предлагаю использовать: -vsync 2 -r МАКС_FPS, где МАКС_FPS нужно брать из m2v файла. Реализовываю это сейчас

Persivan commented 5 months ago

https://github.com/Persivan/Eventurika-Honkai-Impact-Translation/commit/33783538d1f8673268a401c7f872827a2b9cce2e Поправил

Persivan commented 5 months ago

Все еще не идеально) качество меняется, особенно оттенки. Слева оригинальное (доставал через vgmtoolbox, потом вытягивал первый фрейм с помощью potplayer), справа после добавления ру сабов. chrome_8dfEWzXjM9

Devyatyi9 commented 5 months ago

Не уверен связано ли это с уменьшением максимального битрейта после кодирования в usm формат.

Для проверки изменения разных цветов думаю предложить сделать какое-то тестовое видео. Можно даже два. Одно с полной статикой, другое с динамикой (либо какие-то другие варианты, как заглушка для tv например). В кадре цветовой круг, во втором видео его можно было бы вращать, либо как-то ещё двигать в разные стороны/наклонять.

Подозреваю что проблема у кодека именно в кодировании красного спектра Возможно потребуется какая-то корректировка цветового профиля

https://community.adobe.com/t5/after-effects/colour-changes-on-h-264-adobe-media-encoder/m-p/12161312 https://www.reddit.com/r/editors/comments/njpir2/how_to_fix_pixelated_red_text_on_an_h264_export/ https://www.reddit.com/r/VegasPro/comments/x0air5/utilize_h264265s_chroma_subsampling_444_mode/

Кстати о тестовых видео, можно попробовать эти (сурс в описании): https://www.youtube.com/watch?v=mCiabWdtM34 https://www.youtube.com/watch?v=QhZz62bQ_Zk

PS надо бы поглядеть что там за параметры такие использовали

Devyatyi9 commented 5 months ago

Решил посмотреть снова сэмпл для сравнения image

Ну, вроде тоже самое в m2v image Если не считать Color range: Limited и Color primaries

Devyatyi9 commented 5 months ago

Вот ещё по поводу цвета Там же ссылаются на эту статью как источник Но Энкодер в любом случае использует BT.601 (который рассчитан на 720p) https://en.wikipedia.org/wiki/Rec._601 https://en.wikipedia.org/wiki/Chroma_subsampling#4:2:2 image