Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[功能请求] 增加video_autorate选项 #47

Closed
photkey opened this issue Nov 13, 2023 · 10 comments
Closed

[功能请求] 增加video_autorate选项 #47

photkey opened this issue Nov 13, 2023 · 10 comments

Comments

@photkey
Copy link

photkey commented Nov 13, 2023

类似于:--voice_autorate: 如果翻译后的音频时长超过原时长,是否强制加速播放翻译后的音频,以便对齐时长
有时候音频加速太快 以至于都完全无法听清,所以是否可以提供一个自动调整视频的选项,把对应时段内的视频慢放,以对齐时长

@jianchang512
Copy link
Owner

这个过于复杂, 暂时不考虑

实现原理是这样

  1. 记录每个需要降速播放的时间片段,可能有很多个,比如原本是2s的视频,降速2倍后,时长就会变为4s,将改变后的每个片段保存为视频
  2. 然后从原始视频里找出所有不在降速范围内的其他时间片段,分别截取保存
  3. 将上述2步获取的所有片段进行合并。

其中每一步都很复杂, 而且计算量非常大,会很慢。

@photkey
Copy link
Author

photkey commented Nov 13, 2023

是的,确实很复杂,这个是之前我自己在折腾的,直接用ffmpeg 切割以及慢放的时长都调整不精准,查了下说是要用OpenCV切割、调速, 然后就放弃了……

@jianchang512
Copy link
Owner

只ffmpeg应该也能实现

比如 音频片段是 5-10s区间的5s,配音后,音频变为了 12s时长。

那么就对原始视频 5-10s区间应用2.4倍降速播放,时长就是12s,ffmpeg可以取出这个降速后的片段视频 a

然后再对原始视频中 0-5s的片段b,和10s-结束的片段c截取出来。

最后 连接 b a c 这3个片段就行了

当然如果只有一二个片段还好说,不过一般都是几十个片段甚至更多,所以更复杂也更慢了

@photkey
Copy link
Author

photkey commented Nov 14, 2023

我之前就是按你说的这样来操作的,但是我测试了ffmpeg命令 取出片段的时候 不能精确到毫秒(有精确到毫秒的命令,但结果经常不是预期,不精准),调整速度(时长)的时候 偏差就更多了。
因为我对ffmpeg完全不熟悉,都是现用现查的命令,所以我特意到淘宝上找人写一个能精确控制到毫秒的命令,淘宝卖家跟我说实现不了。

也可能还是我对ffmpeg,不熟悉的原因吧,不知道你有没有测试过这些相关的命令。

@jianchang512
Copy link
Owner

不必那么精准吧,到秒或者 0. 几秒也就够了,本身就是降速延时处理的,再精确也没多大意义

只测试过 0.几秒即数百ms的,倒还算精确。

一个视频处理不只是一个片段,整体下来计算量非常庞大,即便GPU加速,也会非常慢的

@jianchang512
Copy link
Owner

如果要精确到ms,确实使用 cv2更方便,按帧读取,然后调整fps,重新输出视频片段,再拼接

@photkey
Copy link
Author

photkey commented Nov 14, 2023

嗯,我查的资料是说cv2可以更精确,至于是不是方便 我就不懂了,cv2完全不会用……
这个功能确实会复杂很多,希望现有功能都完善后,以后可以增加进来,因为在制作出海视频时(中文→其它语言) 确实很多情况会语速太快,我试过的 中文→印尼语 那就是快到完全没法听了。如果是搬运国外视频到国内,这种问题可能还会少一些。

如果以后有可能会增加这个功能的话,或许还可以在加一个参数,--voice_rate_max,voice_rate 到 voice_rate_max 之间的音频,仅通过调整音频对齐时长;当大于voice_rate_max时,语音速度按照voice_rate_max,同时调整视频长度,音视频共同调节对齐时长。

@MedalCollector
Copy link

有没有可能像剪映一样,增加一个“定格”功能,即原始视频画面内容不动,如果需要延长视频时间和音频同步,就将一部分画面定格一段时间。这样就相当于从原始视频中抽了一些帧做了延时,再插入到原来的视频里,不涉及原始视频的大量计算,会不会更快一些?

@jianchang512
Copy link
Owner

jianchang512 commented Nov 21, 2023

有没有可能像剪映一样,增加一个“定格”功能,即原始视频画面内容不动,如果需要延长视频时间和音频同步,就将一部分画面定格一段时间。这样就相当于从原始视频中抽了一些帧做了延时,再插入到原来的视频里,不涉及原始视频的大量计算,会不会更快一些?

有打算在视频的最后,复制最后一帧做视频延长到和音频一致,中间定格实际计算量还是很大的,所谓延时,本质就是将抽出的帧不断复制,直到达到所需时长,然后再插入原视频,而插入,实质上需要将原视频在插入点截断为2个视频片段,然后3个视频再拼接。定格点多了一样需要较大计算量,也很复杂。

而且定格这个功能,只界面都挺复杂了,对于这个没有商业计划的小项目来说,过于复杂了。

@jianchang512
Copy link
Owner

已实现视频自动降速。对应片段降低帧率实现。
默认情况下通过延长视频最后一帧画面实现

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants