将电影时长增加 n 倍

Posted

技术标签:

【中文标题】将电影时长增加 n 倍【英文标题】:Increase movie duration n times 【发布时间】:2020-12-08 01:25:44 【问题描述】:

我用手机录制了一部电影,我想。例如:如果电影的持续时间是 5 秒,则输出的电影应该有 n x 5 秒的持续时间,它应该被重复。我的目标是制作一部 5 秒的电影并重复 n 次,持续 3 小时。我尝试使用moviepy,但它指出了与文件相关的错误。我正在尝试使用 moviepy,但我对 cv2 或任何其他想法持开放态度。这是我的代码和错误:

from moviepy.editor import *

videoclip = VideoFileClip('VID_20201207_022713542.mp4')
audio = afx.audio_loop(videoclip, nloops=3)

和错误:

runfile('C:/Users/felip/Google Drive/Musica/music1.py', wdir='C:/Users/felip/Google Drive/Musica') Traceback(最近一次调用最后一次):

文件“C:\Users\felip\Google Drive\Musica\music1.py”,第 11 行,在 audio = afx.audio_loop(videoclip, nloops=3)

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\audio\fx\audio_loop.py”,第 28 行,在 audio_loop return concatenate_audioclips(nloops*[audioclip])

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\audio\AudioClip.py”,第 319 行,在 concatenate_audioclips 结果 = CompositeAudioClip(newclips).set_duration(tt[-1])

init 中的文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\audio\AudioClip.py”,第 287 行 self.nchannels = max([c.nchannels for c in self.clips])

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\audio\AudioClip.py”,第 287 行,在 self.nchannels = max([c.nchannels for c in self.clips])

AttributeError: 'VideoFileClip' 对象没有属性 'nchannels'

编辑:我试过了:

from moviepy.editor import *

clip = VideoFileClip('VID_20201207_022713542.mp4').fx(vfx.loop, n = 2)
clip.write_videofile("output.mp4")```

and received the error message:

runfile('C:/Users/felip/Google Drive/Musica/music1.py', wdir='C:/Users/felip/Google Drive/Musica') 块:0%| | 0/3044 [00:00, ?it/s, now=None]Moviepy - 构建视频输出.mp4。 MoviePy - 在 outputTEMP_MPY_wvf_snd.mp3 中写入音频 大块:23%|██▎ | 714/3044 [00:02

文件“C:\Users\felip\Google Drive\Musica\music1.py”,第 11 行,在 clip.write_videofile("output.mp4")

文件“”,第 2 行,在 write_videofile 中

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\decorators.py”,第 54 行,在 requires_duration 返回 f(剪辑, *a, **k)

文件“”,第 2 行,在 write_videofile 中

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\decorators.py”,第 135 行,在 use_clip_fps_by_default 返回 f(clip, *new_a, **new_kw)

文件“”,第 2 行,在 write_videofile 中

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\decorators.py”,第 22 行,在 convert_masks_to_RGB 中 返回 f(剪辑, *a, **k)

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\video\VideoClip.py”,第 298 行,在 write_videofile 中 记录器=记录器)

文件“”,第 2 行,在 write_audiofile 中

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\decorators.py”,第 54 行,在 requires_duration 返回 f(剪辑, *a, **k)

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\audio\AudioClip.py”,第 210 行,在 write_audiofile 记录器=记录器)

ffmpeg_audiowrite 中的文件“”,第 2 行

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\decorators.py”,第 54 行,在 requires_duration 返回 f(剪辑, *a, **k)

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\audio\io\ffmpeg_audiowriter.py”,第 169 行,在 ffmpeg_audiowrite 记录器=记录器):

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\audio\AudioClip.py”,第 86 行,位于 iter_chunks fps=fps, buffersize=chunksize)

文件“”,第 2 行,在 to_soundarray 中

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\decorators.py”,第 54 行,在 requires_duration 返回 f(剪辑, *a, **k)

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\audio\AudioClip.py”,第 127 行,在 to_soundarray snd_array = self.get_frame(tt)

文件“”,第 2 行,在 get_frame 中

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\decorators.py”,第 89 行,在包装器中 返回 f(*new_a, **new_kw)

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\Clip.py”,第 93 行,在 get_frame 返回 self.make_frame(t)

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\Clip.py”,第 136 行,在 newclip = self.set_make_frame(lambda t: fun(self.get_frame, t))

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\Clip.py”,第 187 行,在 return self.fl(lambda gf, t: gf(t_func(t)), apply_to,

文件“”,第 2 行,在 get_frame 中

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\decorators.py”,第 89 行,在包装器中 返回 f(*new_a, **new_kw)

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\Clip.py”,第 93 行,在 get_frame 返回 self.make_frame(t)

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\audio\io\AudioFileClip.py”,第 77 行,在 self.make_frame = lambda t: self.reader.get_frame(t)

文件“C:\Users\felip\Anaconda3\lib\site-packages\moviepy\audio\io\readers.py”,第 172 行,在 get_frame "剪辑持续时间=%d 秒,"%self.duration)

OSError:文件 VID_20201207_022713542.mp4 出错,访问时间 t=34.51-34.56 秒,剪辑持续时间=34 秒,

块:25%|██▌ | 762/3044 [00:19

【问题讨论】:

您正在对视频使用音频效果,因此它不起作用。试试 vfx.loop(虽然我似乎记得它有点坏了……GitHub上有开放的 PR 可以修复它)。 @TomBurrows 我试过了:from moviepy.editor import * clip = VideoFileClip('VID_20201207_022713542.mp4').fx(vfx.loop, n = 2) clip.write_videofile("output.mp4") 并收到一条错误消息,我将在问题中更新 好的,这是一个已修复的已知错误:github.com/Zulko/moviepy/pull/1373 @TomBurrows,所以moviepy此时无法做到这一点?我应该尝试另一种方式 您可以从该拉取请求中复制固定版本并直接使用它 【参考方案1】:

我正在使用带有 C++ 的 openCV,所以我不能给你一个 python 或 moviepy 代码,但这里有一个你自己实现的想法。

步骤1)读取目标视频并将每一帧保存到图像数组(Mat类数组)中。

步骤 2)创建一个 VideoWriter 类来保存视频并在其中写入保存的帧 n 次。

我没有音频处理方面的经验,但我想同样的方法也可以。

【讨论】:

谢谢,我试试!【参考方案2】:

你可以使用放慢速度

ffmpeg -i YOUR_INPUT_MOVIE.mp4 -vf  "setpts=5*PTS" YOUR_OUTPUT_MOVIE.mp4

【讨论】:

这个问题被标记为python 和moviepy,我不确定ffmpeg 的解决方案会帮助提问者还是真的合适。 我认为 ffmpeg 是合适的,因为您可以轻松地从 python 内部调用它(这就是 moviepy 在引擎盖下的工作方式!)。但是,问题是要求循环,而不是放慢速度。

以上是关于将电影时长增加 n 倍的主要内容,如果未能解决你的问题,请参考以下文章

GPU加速Pinterest推荐模型,参数量增加100倍,用户活跃度提高16%

没有李飞飞的2018 Google开发者大会:中国开发者数量增加 3 倍,进一步本土化

选择非索引列将“发送数据”增加 25 倍 - 为啥以及如何改进?

CUDA 内核:循环次数增加 10% 时性能下降 10 倍

线上k8s集群TTL 机制排毒,Job已经通过API 增加了Job的TTL 时长,且成功响应,为什么系统还是清理了Job?

使用ffmpeg调整视频时长倍速