Вопрос или проблема
Я пытаюсь транскодировать поток в реальном времени с помощью FFmpeg и одновременно хочу добавить dvbsub. Этот процесс должен быть дружелюбным к процессору, поэтому всю работу должна выполнять GPU. Вот карта потоков:
Stream #0:1[0xb5f]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, top first), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 50 tbr, 90k tbn
Stream #0:2[0xb60](rum): Audio: mp2 ([4][0][0][0] / 0x0004), 48000 Hz, stereo, s16p, 256 kb/s
Stream #0:3[0xb64](rum): Subtitle: dvb_subtitle (dvbsub) ([6][0][0][0] / 0x0006)
Мне удалось наложить субтитры (с помощью CPU) и транскодировать с помощью GPU, и все хорошо. Это команда, которую я использую:
ffmpeg -fflags +genpts -nostats -nostdin -hide_banner -c:v h264_cuvid -deint 2 -drop_second_field 1 -surfaces 10 -i input -filter_complex "[0:s:0] scale=1920:1080 [sub],[0:v][sub] overlay=x=0:y=0:format=auto" -vcodec hevc_nvenc -b_ref_mode 0 -preset fast -cq 10 -g 150 -b:v 3500k -minrate 3000k -maxrate 4000k -bufsize 1002k -map 0:a:0 -c:a libfdk_aac -ac 2 -b:a 192k out
[![Субтитры наложены с помощью CPU][1]][1]
Но субтитры наложены с помощью CPU.
В команде ниже я попытался наложить субтитры с помощью GPU. Но цвета отображаются неправильно, и это решение, которое я нашел до сих пор:
ffmpeg -hwaccel cuvid -c:v h264_cuvid -canvas_size 1820x1080 -i input -filter_complex "[0:v]hwdownload,format=nv12[base];
[0:s:0]scale=1920:1080[subtitle]; [base][subtitle]overlay=y=500:x=620[v];
[v]hwupload_cuda=0,yadif_cuda=0:-1:0[v]" -map "[v]" -vcodec hevc_nvenc -rc-lookahead 20 -i_qfactor 0.75 -b_qfactor 1.1 -b_ref_mode 0 -preset llhq -tune ll -cq 10 -g 150 -b:v 3500k -minrate 3000k -maxrate 4000k -bufsize 2002k -map 0:a:0 -c:a libfdk_aac -ac 2 -b:a 192k out
[![Субтитры отображаются неправильно, наложение с помощью GPU][2]][2]
Проблема, я думаю, в неправильном формате субтитров. Можно ли как-то исправить эту проблему? Если нет, я думаю, если добавить черный фон за субтитрами, можно будет добиться одинакового цвета и избежать влияния того, что отображается:?
Мой вопрос: как я могу добиться такого же результата при наложении субтитров с помощью GPU, спасибо.
[1]: https://i.sstatic.net/KPAJ6pGy.png
[2]: https://i.sstatic.net/G7SIJZQE.png
Ответ или решение
Причина, по которой цвет субтитров DVB при прожиге через FFmpeg и использование графического процессора (GPU) может отображаться неправильно, связана с несколькими аспектами. Давайте подробно разберем эту проблему и представим пути ее решения.
Понимание проблемы и ее причин
Вы столкнулись с несовпадением цветов субтитров при использовании графического процессора для их наложения. Основной проблемой, вероятно, является несоответствие цветовых пространств или ошибка в обработке цвета субтитров по умолчанию. Видеопотоки и субтитры могут работать в разных цветовых пространствах, таких как YUV и RGB. Некорректная конвертация между ними может приводить к искажению цвета.
Анализ команды FFmpeg
Команды FFmpeg имеют значительное количество опций, которые могут влиять на конечный результат:
-
hwaccel и hwupload: Эти опции используются для аппаратного ускорения и загрузки видеокадров в GPU. Вероятно, что данное сочетание не поддерживает корректную обработку цветовых пространств для субтитров DVB.
-
format=nv12: Этот формат может не обеспечивать правильное цветовое отображение. Замена на другой формат, более подходящий для работы с цветами субтитров, может помочь.
-
overlay и scale фильтры: Убедитесь, что эти фильтры правильно взаимодействуют в контексте GPU. Информация о корректной поддержке цветовых пространств здесь также важна.
Решение проблемы
-
Цветовое пространство субтитров: Попробуйте явно указать цветовое пространство для субтитров. Используйте фильтры, которые позволяют отобразить субтитры в нужной цветовой палитре, например, добавьте флаг
colorspace
для фильтра overlay. -
Скалирование субтитров: Убедитесь, что операции скалирования не теряют цветовые данные. Протестируйте
-vf "scale=1920:1080:flags=accurate_rnd"
-
Дополнительные фильтры обработки: Если проблема остается, попробуйте добавить черную подложку или фон для субтитров. Это может помочь нивелировать эффект неправильного цветового восприятия.
-
Тестирование и отладка: Протестируйте субтитры отдельно с ясной цветовой схемой и проверьте их сопряжение с видео.
Работа с аппаратным ускорением в контексте наложения субтитров может требовать дополнительных усилий по отладке и настройке, особенно когда речь идет о специфических форматах, таких как dvbsub.
Заключение
Обратите внимание, что синхронизация всех этих параметров для корректного отображения требует тщательного подхода и настройки. В случае если стандартные методы не работают, попробуйте конвертировать субтитры в другой формат с помощью промежуточного шага и вновь импортировать для наложения через GPU. Это может быть более сложной, но эффективной стратегией.