FFMPEG 创建模糊视频

FFMPEG Creates blurry video

有了这个库 https://github.com/tanersener/mobile-ffmpeg,我在 iOS 上使用 FFMPEG。我正在尝试从音频创建视频,并添加相关的波形、背景和徽标图像。

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)"

使用第二个命令,我在左上角添加了一个徽标图像。

当我直接在终端上执行这些命令时,输出的视频质量很高,没有任何问题。但是当我在 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

正在使用旧编码器

您在 iOS 上的 ffmpeg 没有启用 H.264 或 H.265/HEVC 视频编码器。例如,您的配置行中缺少 --enable-libx264。因此默认情况下,MP4 输出 ffmpeg 使用名为 mpeg4 的编码器。此编码器输出较旧的传统视频格式:MPEG-4 Part 2。

  • mpeg4 可以产生高质量的输出,但它需要比更现代的编码器(如 libx264)更高的比特率。

  • HTML5 视频不支持 MPEG-4 Part 2 视频,并且在现代设备上的支持较少。

在 iOS 上使用 ffmpeg 支持您需要的格式的现代编码器。

世代流失

当您只需要编码一次时,您就是在编码两次。这导致 generation loss。一个命令完成所有事情:

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 过滤器,因此为了简单起见,我将其更改为 scale 过滤器。
  • 我在叠加滤镜中添加了 format 选项,可以提高质量。
  • 然后添加 format filter 以确保 yuv420p 像素格式以获得最大播放器兼容性。
  • 添加了
  • -movflags +faststart 以启用快速启动播放。