当前位置: 首页 > 面试题库 >

如何连接具有不同属性的ffmpeg中的视频?

傅高逸
2023-03-14
问题内容

我正在尝试合并一些视频,但出现时间戳错误。

我试图通过相同的尺寸,帧速率,采样率以及在没有音频轨道时添加音轨来使它们都相等。

lista = ['1.mp4', '2.mp4', '3.mp4']
path = '/Downloads/abc/'
a = open('/Downloads/abc/list.txt', 'w+')

i = 0
for f in lista:
    i += 1
    places = path + str(i) + 'test.mp4'
    res = path + str(i) + 'fixtest.mp4'
    bb = check_output(shlex.split('ffprobe -i ' + f + ' -show_streams -select_streams a -loglevel error'))
        if len(bb) == 0:
            subprocess.call('ffmpeg -i ' + f + ' -y -i audio.mp3 -c:v copy -c:a aac -shortest -strict experimental ' + res)
            subprocess.call('ffmpeg -i ' + res + ' -y -ar 48000 -vf scale=1280:720 ' + places)
        else:
            subprocess.call('ffmpeg -i ' + f + ' -framerate 30 -y -ar 48000 -vf scale=1280:720 ' + places)
        a.write("file '" + path + str(i) + "test.mp4'\n")

a.close
subprocess.call('ffmpeg -y -safe 0 -f concat -i list.txt -c copy output.mp4')

错误消息如下所示:输出流0:0中的非单调DTS;前一个:8052684,当前:4127401; 更改为8052685。这可能会导致输出文件中的时间戳不正确。


问题答案:

因为这纯粹是一个ffmpeg使用问题,所以我将省略Python。由于我假设您的输入将是任意的,因此我建议使用concat过滤器而不是concat多路分配器,因为您将需要执行过滤以使所有内容均符合一组通用参数,并且您可以一次完成所有操作命令。

使所有视频1280x720、1:1 SAR,30 fps,yuv420p

使用比例(宽度x高度/分辨率),setsar(纵横比),fps(帧速率),格式(色度二次采样)和concat(串联/合并)过滤器。

ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex \
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1,setsar=1,fps=30,format=yuv420p[v0];
 [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1,setsar=1,fps=30,format=yuv420p[v1];
 [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1,setsar=1,fps=30,format=yuv420p[v2];
 [v0][0:a][v1][1:a][v2][2:a]concat=n=3:v=1:a=1[v][a]" \
-map "[v]" -map "[a]" -c:v libx264 -c:a aac -movflags +faststart output.mp4

与上述相同,但也将音频处理为48000采样率的立体声

添加了格式(采样率和通道布局)过滤器。

ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex \
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1,setsar=1,fps=30,format=yuv420p[v0];
 [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1,setsar=1,fps=30,format=yuv420p[v1];
 [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1,setsar=1,fps=30,format=yuv420p[v2];
 [0:a]aformat=sample_rates=48000:channel_layouts=stereo[a0];
 [1:a]aformat=sample_rates=48000:channel_layouts=stereo[a1];
 [2:a]aformat=sample_rates=48000:channel_layouts=stereo[a2];
 [v0][a0][v1][a1][v2][a2]concat=n=3:v=1:a=1[v][a]" \
-map "[v]" -map "[a]" -c:v libx264 -c:a aac -movflags +faststart output.mp4

带水印

ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i logo.png -filter_complex \
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1,setsar=1,fps=30,format=yuv420p[v0];
 [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1,setsar=1,fps=30,format=yuv420p[v1];
 [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1,setsar=1,fps=30,format=yuv420p[v2];
 [0:a]aformat=sample_rates=48000:channel_layouts=stereo[a0];
 [1:a]aformat=sample_rates=48000:channel_layouts=stereo[a1];
 [2:a]aformat=sample_rates=48000:channel_layouts=stereo[a2];
 [v0][a0][v1][a1][v2][a2]concat=n=3:v=1:a=1[vid][a];[vid][3]overlay=W-w-5:H-h-5[v]" \
-map "[v]" -map "[a]" -c:v libx264 -c:a aac -movflags +faststart output.mp4

有关更多信息,请参见覆盖过滤器文档和如何使用ffmpeg添加和放置水印?

为没有音频的输入添加静音虚拟音频

如果您的输入之一不包含音频,则anullsrc过滤器用于提供静音虚拟音频。这可能是必需的,因为要串联的所有段都必须具有相同数量和类型的流。换句话说,您不能将没有音频的视频连接到有音频的视频。因此,可以像以下示例一样添加无声音频:

ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -t 0.1 -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=48000 -filter_complex \
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1,setsar=1,fps=30,format=yuv420p[v0];
 [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1,setsar=1,fps=30,format=yuv420p[v1];
 [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720::-1:-1,setsar=1,fps=30,format=yuv420p[v2];
 [0:a]aformat=sample_rates=48000:channel_layouts=stereo[a0];
 [2:a]aformat=sample_rates=48000:channel_layouts=stereo[a2];
 [v0][a0][v1][3:a][v2][a2]concat=n=3:v=1:a=1[v][a]" \
-map "[v]" -map "[a]" -c:v libx264 -c:a aac -movflags +faststart output.mp4

注意: 保持-t 0.1原样:anullsrc的持续时间仅需要短于相关视频输入的持续时间。concat过滤器将自动扩展无声音频,以匹配相关视频输入的长度。



 类似资料:
  • 我试图合并一些视频,但我得到时间戳错误。 我试图让它们都相等,具有相同的尺寸,帧率,采样率,还通过添加一个音频轨道,当没有。 错误消息:

  • 问题内容: 我有一个JSON 不同系列中的值是(“ rating”:0)或(“ rating”:“ 9.6747”)。 我正在使用Codable / Decodable协议解析JSON: 如果rating == String,则我的代码有效,并且我具有JSON中的所有变量,但是如果rating == Int,则全部为。我应该怎么做来解析所有类型变量一次和? 我的可解码功能: 谢谢。 问题答案: 您

  • null 这是我正在使用的代码,任何提示都将不胜感激! 将每个视频转换为临时文件

  • 我在开发一个应用程序。人们从他们的手机上传视频,从其他地方。 使用PHP中的CMS(它是应用程序开发的语言),我需要生成一个独特的视频与这些部分上传。 为什么不加入2? 上传的视频,将是非常不同的格式,所以我不能定义编解码器。

  • 我试图通过在Local上连接两个数据流来运行Flink上的基本连接。源流的数据类型是相同的(Tuple4(String,String,Long,Long))。在多次运行下面提到的函数后,我随机收到了两个不同的输出(存储在下面的变量CollectTuple2Sink中,下面提到了相同的调试日志)。我尝试保持并行度1和最大并行度1,但问题仍然存在。 源函数和其他定义都来自本教程。还从Flink官方文件

  • 问题内容: 我面对的是一个设计不当的数据库,该数据库具有非规范化的表X。该表X应该与另一个表Y具有N:M关系。 问题在于,这种关系当前为1:N,而到目前为止,在存在各种要关联的注册表的情况下,使用杰瑞操纵的解决方案是重复这些条目。 简化一下,我有这个: 我必须对这张表进行归一化处理。因此,我的第一个想法是尝试获取成对的相似注册表。像这样的东西: 做一点实验: 这导致这样的问题: 两对重复。 经过一