Вопрос или проблема
Я использую свой телефон для потоковой передачи живых видео на свой сервер обычным способом с использованием javascript и getUserMedia()
и т.д. Затем я использую FFMPEG для кодирования в реальном времени и дополнительно накладываю на него видео оверлея.
По какой-то причине каждый раз, когда я поворачиваю телефон в альбомный режим или обратно в портретный режим, видео оверлея сдвигается вперед во времени. Видео оверлея не изменяется, пока потоковое видео кодируется. Это просто видеофайл с жесткого диска, никакого потока. Есть идеи, в чем дело?
Я пробовал разные версии FFMPEG, но поведение всегда одно и то же.
Оранжевый – это живой поток. Зеленый – это оверлей.
Команда FFMPEG
ffmpeg -re -i strm.webm -i overlay.webm -filter_complex "[0:v]scale=640:480:force_original_aspect_ratio=decreasepad=640:480:-1:-1:color=black[main];[1]scale=iw/1.5:-1setpts=PTS-STARTPTS,format=yuva420p[ovrl]; [main][ovrl]overlay=W-w-10:10[v]; [0:a][1:a]amerge[a]" -r 24 -deadline realtime -crf 22 -cpu-used 15 -level 2.0 -map "[v]" -map "[a]" -c:a aac -c:v libvpx -pix_fmt nv12 -threads 4 -strict -2 -auto-alt-ref 0 -b:v:1 1800k -s:v:1 1280x720 -b:v:0 300k -s:v:0 640x480 -bf 1 -keyint_min 48 -g 48 -sc_threshold 1 -b_strategy 0 -ar:a:1 96000 -scenario livestreaming -look_ahead 0 -seg_duration 2 -remove_at_exit 1 -streaming 1 -window_size 30 -adaptation_sets "id=0,streams=v id=1,streams=a" -utc_timing_url https://time.akamai.com/?iso -live 1 -y -f dash manifest.mpd
Ответ или решение
Проблема временных скачков видео при повороте экрана мобильного телефона при записи
Ваша ситуация, связанная с временными скачками видео при повороте экрана мобильного устройства, может быть результатом нескольких факторов, связанных как с кодированием, так и с поведением системы в целом. В данной ситуации мы имеем комбинацию живого потока и накладного видео, которое не изменяется в процессе обработки. Рассмотрим основные возможные причины и решения.
1. Синхронизация потоков
При использовании ffmpeg
для кодирования двух потоков (живого видео и накладного видео), система должна правильно синхронизировать аудио и видео. При изменении ориентации экрана может происходить сбой синхронизации, который вызывает временные скачки. Рекомендуется проверить настройки временных меток (PTS) ваших видео:
- Убедитесь, что используете параметр
setpts=N/(FRAME_RATE*TB)
для явного указания временных меток для накладного видео.
2. Изменение кодека или параметров обработки
Попробуйте использовать разные кодеки и параметры, которые могут сгладить процесс кодирования в реальном времени. Например, вместо libvpx
вы можете протестировать кодек libx264
, используя менее агрессивные параметры:
-c:v libx264 -preset fast -crf 22
Это может помочь улучшить производительность и стабильность при обработке видео, особенно в условиях изменения ориентации.
3. Обработка событий изменения ориентации
Необходимо убедиться, что ваша JavaScript-логика правильно обрабатывает события изменения ориентации экрана. Добавление задержки при переключении ориентации, а также пауза в потоке во время обработки события может улучшить синхронизацию видео.
4. Тестирование с минимизацией внешних факторов
Рекомендуется провести тестирование с минимально возможной конфигурацией: отключить дополнительные фильтры, временные метки и другие параметры, чтобы установить, вызвана ли проблема одним из них.
5. Мониторинг и диагностика
Используйте опции логирования FFmpeg
для более тщательного мониторинга во время записи:
-loglevel verbose
Это поможет выявить скрытые ошибки и предупредительные сигналы.
Заключение
Таким образом, проблемы с временными скачками в видео при изменении ориентации экрана мобильного устройства могут быть вызваны сочетанием проблем синхронизации потоков, ошибок в обработке событий и настроек кодирования. Следуя вышеперечисленным рекомендациям и проверяя каждый параметр, вы сможете более точно диагностировать и решать вашу проблему.