FFmpeg-Python 音频在最终视频中丢失

2023-12-24

我试图将视频放置在背景图像之上,但生成的输出视频没有音频。有什么办法可以让音频保持原样吗?

def ConvertVideo(source,background,start,end,dest):
    stream = ffmpeg.input(source)
    strea1 = ffmpeg.input(background)
    duration = end - start
    stream = stream.trim(start=start,duration=duration).filter('setpts', 'PTS-STARTPTS')
    stream = stream.crop(100,0,1080,720)
    stream = ffmpeg.overlay(strea1,stream,x=0,y=180)
    stream = stream.output(dest)

有谁知道为什么音频会丢失?这个问题有什么解决办法吗?


我们必须显式添加音频流。
就像是:ffmpeg.output(overlaid_vid_stream, audio_stream, dest).


首先使用 FFmpeg CLI 创建合成输入视频和背景(只是为了使发布的解决方案可重复且“自包含”)。

  • 创建带有音频的输入视频:

     ffmpeg -y -f lavfi -i testsrc=size=128x72:rate=1 -f lavfi -i sine=frequency=400 -f lavfi -i sine=frequency=1000 -filter_complex "[1:a][2:a]amix=inputs=2" -vcodec libx264 -g 10 -crf 17 -pix_fmt yuv420p -acodec aac -ar 22050 -t 50 in.mp4
    
  • 创建黄色背景图像:

     ffmpeg.exe -y -f lavfi -i color=yellow:size=128x72 -frames:v 1 background.png
    

例如,大小为 128x72(假设您的输入为 1280x720)。


以下代码示例适用trim, setpts, crop and overlay过滤并添加源音频:

source = 'in.mp4'
background = 'background.png'
dest = 'out.mp4'
end = 40
start = 10

duration = end - start

vid_stream = ffmpeg.input(source).video  # Source video stream
audio_stream = ffmpeg.input(source).audio  # Source audio stream
vid_background = ffmpeg.input(background).video  # Background video stream

trimed_vid_stream = vid_stream.trim(start=start, duration=duration).filter('setpts', 'PTS-STARTPTS').crop(10, 0, 108, 72)  # Source video stream after trimming and cropping
overlaid_vid_stream = ffmpeg.overlay(vid_background, trimed_vid_stream, x=0, y=18)  # Video stream overlay of background and trimed_vid_stream

trimed_audio_stream = audio_stream.filter('atrim', start=start, duration=duration).filter('asetpts', 'PTS-STARTPTS')  # Trimming the audio
output_video_and_audio = ffmpeg.output(overlaid_vid_stream, trimed_audio_stream, dest)  # Output - video applies overlaid_vid_stream, and audio applies trimmed source audio

output_video_and_audio.overwrite_output().run() # Execute FFmpeg

我修改了你的命名使其更有意义(命名一切stream使其难以遵循)。
我还删除了该方法,并将参数设置为特定值(只是为了使发布的解决方案可重现)。


该解决方案应用以下主要阶段:

  • 创建对视频和音频流的引用:

     vid_stream = ffmpeg.input(source).video  # Source video stream
     audio_stream = ffmpeg.input(source).audio  # Source audio stream
    
  • 定义视频过滤器:

     vid_background = ffmpeg.input(background).video  # Background video stream
     trimed_vid_stream = vid_stream.trim(start=start, duration=duration).filter('setpts', 'PTS-STARTPTS').crop(10, 0, 108, 72)  # Source video stream after trimming and cropping
     overlaid_vid_stream = ffmpeg.overlay(vid_background, trimed_vid_stream, x=0, y=18)  # Video stream overlay of background and trimed_vid_stream
    
  • 定义音频过滤器(修剪音频):

     trimed_audio_stream = audio_stream.filter('atrim', start=start, duration=duration).filter('asetpts', 'PTS-STARTPTS')  # Trimming the audio
    
  • 定义输出以包括“过滤”视频和修剪后的音频:

     output_video_and_audio = ffmpeg.output(overlaid_vid_stream, trimed_audio_stream, dest)  # Output - video applies overlaid_vid_stream, and audio applies trimmed source audio
    
  • 执行FFmpeg:

     output_video_and_audio.overwrite_output().run() # Execute FFmpeg
    

Sample output frame:
enter image description here

视频中包含蜂鸣声...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FFmpeg-Python 音频在最终视频中丢失 的相关文章

随机推荐

  • 是否有针对 ASP.NET MVC 的分页解决方案在数据库中进行分页?

    我通过谷歌搜索发现的大多数 ASP NET MVC 分页解决方案看起来都以 IEnumerable 集合的形式从数据库表中获取所有行 对 IEnumerable 集合执行一些分页转换 然后将结果返回到视图 我希望能够在数据库端进行分页 但仍
  • 使用 Wait() 时 StreamSocket.InputStreamOptions.ReadAsync 挂起

    这是我能够准备的最小可能场景 此代码连接到 imap gmail com 读取初始服务器问候语 使用 Read 方法 发送NOOP命令 NO操作 读取 NOOP 命令响应 再次使用 Read 方法 问题是第二次读取挂起 如果使用 await
  • 无需源代码即可调试/绕过 BSOD

    你好 祝你有美好的一天 这里需要一些帮助 情况 我有一个不起眼的 DirectX 9 应用程序 名称和应用程序详细信息与问题无关 自某些驱动程序版本以来 它会导致所有 nvidia 卡 GeForce 8400GS 及更高版本 出现蓝屏死机
  • 类变量中的类型提示

    对于上面的代码 我收到以下错误 Parse error syntax error unexpected Connectors T STRING expecting variable T VARIABLE 当我删除类型提示并var dump
  • 如何让yield在调试模式下工作?

    我正在使用 ipdb 和 Yield 我注意到与 ipdb 一起使用时 产量并没有达到预期的效果 具体来说 当使用 ipdb 调试此代码时 并按 n 键盘中的字符只是跳过yield命令而不是从函数返回 def cats print 1 yi
  • Android ApplicationRecord 和 Google Analytics

    我正在开发一个可以通过 AndroidApplicationRecord 安装和打开的应用程序 AAR 请参阅http developer android com guide topics nfc nfc html http develop
  • 默认会话过期超时?

    默认情况下JSESSIONID关闭浏览器时cookie就过期了 但是关联的时间是多久HttpSession在服务器端真的有效吗 大多数容器默认为 30 分钟 您可以通过以下方式进行配置
  • 如何继承样式并覆盖某些内容?

    具体问题是如何继承我的自定义样式 Water 并覆盖其 Grid Background 部分 有没有可能 首先 我只想在那里放另一张图片 ButtonStyles1 xaml
  • __USE_FILE_OFFSET64 与 _FILE_OFFSET_BITS=64

    我正在尝试维护在许多不同系统上编译的代码 我见过十几种不同的请求方式lseek这需要 64 位 一些系统使用lseek64 一些使用lseeko 有些要求您定义 FILE OFFSET BITS 64 现在我刚刚找到了一个新的 需要你定义
  • 从命名范围的 Name 对象获取工作表名称

    I have Microsoft Office Interop Excel Workbook wb Microsoft Office Interop Excel Name name 假设我已经获得了命名范围的 Name 对象和 wb 有什么
  • 创建视图还是使用内部联接?

    我有一个规范化的数据库 其中外键 主键提供一对多数据库 我计划使用 PHP 访问该数据库以进行基本的前端 后端显示 现在 我的问题来自这两个示例查询 CREATE VIEW view AS SELECT functiondetails De
  • 在 Visual Studio 2010 中运行的 Windows Phone 8 SDK

    我知道这个 SDK 还没有完成 但是一些幸运的开发人员已经拿到了它 所以我的问题是 当您安装 Windows Phone 8 SDK 时 它是否也在 Visual Studio 2010 中安装了 SDK 或者只是在 Visual Stud
  • 在cuda中是否有更好/更干净/更优雅的malloc和free方式?

    我正在尝试 cudaMalloc 一堆设备指针 如果任何 malloc 不起作用 则优雅地退出 我有功能代码 但臃肿 因为如果失败 我必须 cudaFree 我之前 malloc 的所有内容 所以现在我想知道是否有更简洁的方法来实现这一点
  • 如何将 dtype='datetime64[ns]' 转换为浮点数?

    我正在练习线性回归 在这里我将日期作为输入 x 传递并期望输出 y float x df Date values x x reshape 1 1 y df MeanTemp values MeanTemp column has float
  • 在 C# 中转换为泛型类型失败

    我希望通过创建动态 GetControl 方法来节省一些编码 我的想法是这样的 private T GetControl
  • Rust:为关联类型实现特征“From”(错误)

    这是我之前问题的后续问题 Rust 从标准输入读取和映射行并处理不同的错误类型 https stackoverflow com questions 59187274 rust read and map lines from stdin an
  • CSS 类选择器通配符[重复]

    这个问题在这里已经有答案了 所以我想知道是否有办法在 CSS 中添加通配符 我有几个课程是 button 0 button 1 button 2 button 3等在一个button元素 我想得到所有 button 类来定义 是否可以做类似
  • 提取括号之间文本的模式

    如何从中提取字符串 and 使用模式匹配或任何东西 例如 如果文本是 你好 Java 那么如何只得到 Java 尝试这个 String x Hello Java Matcher m Pattern compile matcher x whi
  • 我可以使用客户端 Javascript 执行 DNS 查找(主机名到 IP 地址)吗?

    我想使用客户端 Javascript 来执行从客户端计算机看到的 DNS 查找 主机名到 IP 地址 那可能吗 Edit 这个问题让我很痒 所以我在 Google App Engine 上建立了一个 JSON Web 服务来返回客户端的 I
  • FFmpeg-Python 音频在最终视频中丢失

    我试图将视频放置在背景图像之上 但生成的输出视频没有音频 有什么办法可以让音频保持原样吗 def ConvertVideo source background start end dest stream ffmpeg input sourc