ios - FFMPEG 创建模糊视频

标签 ios swift ffmpeg video-editing mobile-ffmpeg

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

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)"
使用第二个命令,我在左上角添加了一个 Logo 图像。
当我直接在终端上执行这些命令时,输出的视频质量很高,没有问题。但是当我在 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

最佳答案

正在使用旧编码器
您的 ffmpeg在 iOS 上没有启用 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添加以启用快速开始播放。
  • 关于ios - FFMPEG 创建模糊视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62889848/

    相关文章:

    ios - 从 MapPin 中删除 subview

    arrays - 使用数组 Swift SpriteKit 生成多个硬币节点

    bash - 这个单行 Bash 脚本的错误在哪里?

    FFMPEG 图片+音乐=视频

    ios - 使用 NSURL 无法识别 URL 变量

    iphone - "Code Sign error: No unexpired provisioning profiles found that contain any of the keychain' s 签名证书"

    Swift 4 从 Subview 回来

    ios - 解析 PFAnalytics 不跟踪推送打开

    ffmpeg - 将两个 ffmpeg 命令组合成一个命令

    ios - 异步图像加载不起作用?