视频处理
使用 FFmpeg 拆分视频文件
在互联网上播放的视频通常会被切分成N个.TS格式的视频文件
- 优化用户体验,减少首次播放的加载时间
- .TS格式可以保证多个文件之间的无缝播放(通过.M3U8索引文件来记录播放顺序)
- M3U8文件是指UTF-8编码格式下的M3U视频索引,播放器通过这个索引文件就可以找到视频下所有的分段,并依次播放视频
from subprocess import run
from pathlib import Path
input_video = Path.cwd().joinpath("video/test.mp4")
segment_time = 10
m3u8_list = Path.cwd().joinpath("video/test.m3u8")
output_video = Path.cwd().joinpath("video/test-%4d.ts")
cmd = ["/usr/local/ffmpeg/bin/ffmpeg", "-i", input_video, "-f", "segment", "-segment_time", str(segment_time), "-segment_format",
"mpegts", "-segment_list", m3u8_list, "-c", "copy", "-bsf:v", "h264_mp4toannexb", "-map", "0", output_video]
run(cmd)
使用 video.js 播放视频
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="https://vjs.zencdn.net/7.4.1/video-js.css" rel="stylesheet">
<script src='https://vjs.zencdn.net/7.4.1/video.js'></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/videojs-contrib-hls/5.15.0/videojs-contrib-hls.min.js"></script>
</head>
<body>
<video id="test" class="video-js vjs-default-skin">
<source id="source" src="http://www.test.com/video/test.m3u8" type="application/x-mpegURL" />
</video>
<script>
var myVideo = videojs('test', {
loop: true,
controls: false,
preload: 'auto',
autoplay: true
})
</script>
</body>
</html>
合并.TS文件为.mp4文件
from subprocess import run
from pathlib import Path
input_file = Path.cwd().joinpath("video/test.m3u8")
output_file = Path.cwd().joinpath("video/test_new.mp4")
cmd = ["/usr/local/ffmpeg/bin/ffmpeg", "-allowed_extensions", "ALL", "-protocol_whitelist",
"file,http,crypto,tcp,https", "-i", input_file, "-c", "copy", output_file]
run(cmd)
视频转GIF
from moviepy.editor import *
# 裁剪视频第1秒到60秒并重置宽高
# resize也可以传入比例,如:resize(0.5),缩放一半
clip = (VideoFileClip("1.mp4").subclip(t_start=1, t_end=60).resize((488, 225)))
# 设置为每秒15帧
clip.write_gif("1.gif", fps=15)
m4a转mp3
from moviepy.editor import AudioFileClip
# 输入和输出文件路径
input_file = "./input.m4a"
output_file = "output.mp3"
# 读取音频文件
audio = AudioFileClip(input_file)
# 将音频写入新的MP3文件
audio.write_audiofile(output_file, codec='libmp3lame')
print(f"转换完成!已将 {input_file} 转换为 {output_file}。")