FFMPEG Создает размытое видео - PullRequest
0 голосов
/ 14 июля 2020

С этой библиотекой https://github.com/tanersener/mobile-ffmpeg, я использую FFMPEG на iOS. Я пытаюсь создать видео из аудио с его соответствующей формой волны, фоном и добавленным изображением lo go.

let command = "-i \(audioPath) -i \(imagePath) -filter_complex \"[0:a]showwaves=s=hd720:mode=line: colors=0x666666|0x555555[v];[1:v]scale=hd720[bg];[bg][v]overlay=shortest=0:main_h-overlay_h-35[outv]\" -shortest -map '[outv]' -map 'a' -c:a aac -f mp4 \(videoPath)"

С помощью указанной выше команды я создаю видео со звуком, формой волны и фоновое изображение.

let artworkCommand = "-y -i \(videoPath) -i \(artworkPath) -filter_complex \"[1:v][0:v]scale2ref=200:200[logo1][base];[base][logo1]overlay=20:20[v]\" -map \"[v]\" -map 0:a -y -codec:a copy \(artVideoPath)"

Второй командой я добавляю изображение lo go в верхнем левом углу.

Когда я выполняю эти команды непосредственно на терминале, вывод видео качественный и не имеет проблем. Но когда я пробую те же команды на устройстве iOS, после первой секунды видео оно становится размытым.

Похоже, что при выполнении самой первой команды изображение становится размытым. Может ли кто-нибудь пролить свет на то, почему это происходит? TIA.

Обновление 1 Журнал - https://www.dropbox.com/s/ev8gw8bvfe1m7ur/Logs_FFMPEG.rtf?dl=0

Обновление 2 Я изменил обе команды, чтобы включить битрейт , как было предложено. Видео улучшилось, но время от времени оно размывается.

let command = "-i \(audioPath) -i \(imagePath) -filter_complex \"[0:a]showwaves=s=hd720:mode=line: colors=0x666666|0x555555[v];[1:v]scale=hd720[bg];[bg][v]overlay=shortest=0:main_h-overlay_h-35[outv]\" -shortest -map '[outv]' -map 'a' -c:a aac -b:v 2M \(videoPath)"
let artworkCommand = "-y -i \(videoPath) -i \(artworkPath) -filter_complex \"[1:v][0:v]scale2ref=200:200[logo1][base];[base][logo1]overlay=20:20[v]\" -map \"[v]\" -map 'a' -c:a aac -b:v 2M \(artVideoPath)"

Демонстрация для обеих команд, выполняемых на iOS устройстве - https://www.dropbox.com/s/6ux4obufb0eiax6/video1x1_art.MP4?dl=0

Бревна - https://www.dropbox.com/s/cjm259oehd048xb/Logs2.rtf?dl=0

1 Ответ

0 голосов
/ 15 июля 2020

Используется старый кодировщик

На вашем ffmpeg на iOS не включен видеокодер H.264 или H.265 / HEV C. Например, --enable-libx264 отсутствует в вашей строке конфигурации. Поэтому по умолчанию для вывода MP4 ffmpeg использует кодировщик с именем mpeg4 . Этот кодировщик выводит старый устаревший видеоформат: MPEG-4, часть 2.

  • mpeg4 может обеспечить вывод хорошего качества, но для него требуется гораздо больший битрейт, чем для более современного кодировщика, такого как libx264.

  • Видео MPEG-4 Part 2 не поддерживается видео HTML5 и имеет меньшую поддержку на современных устройствах.

Вкл. iOS используйте ffmpeg, который поддерживает современный кодировщик для нужного вам формата.

Потеря генерации

Вы кодируете дважды, когда вам нужно кодировать только один раз. Это вызывает потерю генерации . Сделайте все одной командой:

let command = "-i \(audioPath) -i \(imagePath) -i \(artworkPath) -filter_complex \"[0:a]showwaves=s=hd720:mode=line: colors=0x666666|0x555555[v];[1:v]scale=hd720[bg];[bg][v]overlay=shortest=0:main_h-overlay_h-35:format=auto[bg];[2]scale=200:200[fg];[bg][fg]overlay=20:20:format=auto,format=yuv420p[outv]\" -shortest -map '[outv]' -map 0:a -c:a aac -movflags +faststart -f mp4 \(videoPath)"

Другие изменения:

  • Я не видел причин для использования фильтра scale2ref, поэтому для простоты я заменил его на фильтр масштабирования.
  • Я добавил опцию format к фильтрам наложения, которые могут улучшить качество.
  • Затем был добавлен фильтр формата , чтобы обеспечить формат пикселей yuv420p для максимальной совместимости с плеером.
  • -movflags +faststart был добавлен для включения быстрого запуска воспроизведения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...