如何解决如何通过Python将视频压缩到目标大小?
我正在通过Python程序将文本和视频上传到站点。该网站说,他们只能接收最大50 MB的视频文件。否则,他们将拒绝视频和其他相关信息。
为确保我可以连续发送视频,我想在发送之前将其压缩为目标大小(例如50 MB)。因为没有质量损失是不可能的,所以在视频或音频中损失适度的清晰度也是可以的。
Python是否为此目的提供任何优雅的方式?谢谢!
解决方法
我过去使用MoviePy时效果很好。 另一个选择(不是最安全的)可能是将FFMpeg作为外部进程运行,以压缩或调整媒体文件的大小。
,通过Python和FFmpeg压缩视频文件
工具
FFmpeg是用于视频编辑的强大工具。为此,有一个很棒的Python绑定,名为ffmpeg-python(API Reference)。首先是pip install ffmpeg-python
和install FFmpeg。
步骤
通过功能ffmpeg.probe()
探测视频配置,以获取持续时间,音频和视频比特率等。并根据我们拥有的内容计算目标文件的比特率。然后,用ffmpeg.input()
和ffmpeg.output()
构造命令。最后,运行它。
代码
以下是示例代码。如果需要,可以根据您的情况更改压缩算法。为了便于后续操作,我隐藏了边界条件代码。我使用的代码在GitHub Gist中。欢迎任何错误报告!
import os,ffmpeg
def compress_video(video_full_path,output_file_name,target_size):
# Reference: https://en.wikipedia.org/wiki/Bit_rate#Encoding_bit_rate
min_audio_bitrate = 32000
max_audio_bitrate = 256000
probe = ffmpeg.probe(video_full_path)
# Video duration,in s.
duration = float(probe['format']['duration'])
# Audio bitrate,in bps.
audio_bitrate = float(next((s for s in probe['streams'] if s['codec_type'] == 'audio'),None)['bit_rate'])
# Target total bitrate,in bps.
target_total_bitrate = (target_size * 1024 * 8) / (1.073741824 * duration)
# Target audio bitrate,in bps
if 10 * audio_bitrate > target_total_bitrate:
audio_bitrate = target_total_bitrate / 10
if audio_bitrate < min_audio_bitrate < target_total_bitrate:
audio_bitrate = min_audio_bitrate
elif audio_bitrate > max_audio_bitrate:
audio_bitrate = max_audio_bitrate
# Target video bitrate,in bps.
video_bitrate = target_total_bitrate - audio_bitrate
i = ffmpeg.input(video_full_path)
ffmpeg.output(i,'/dev/null' if os.path.exists('/dev/null') else 'NUL',**{'c:v': 'libx264','b:v': video_bitrate,'pass': 1,'f': 'mp4'}
).overwrite_output().run()
ffmpeg.output(i,'pass': 2,'c:a': 'aac','b:a': audio_bitrate}
).overwrite_output().run()
compress_video('input.mp4','output.mp4',50 * 1000)
注释
-
别浪费时间!压缩前判断文件大小。
-
'/dev/null' if os.path.exists('/dev/null') else 'NUL'
使此代码段同时在Windows和Linux上运行。 -
您可以通过仅保留第二个
ffmpeg.output()
而不使用参数'pass': 2
来禁用两次通过功能。 -
如果视频比特率Bitrate is extremely low。
-
我建议的最大最小文件大小为:
# Best min size,in kB.
best_min_size = (32000 + 100000) * (1.073741824 * duration) / (8 * 1024)
- 如果您指定非常小的目标文件大小,则生成的文件的大小可能会超过它。在大多数情况下,这种情况不会发生。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。