视频处理

使用 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}。")

results matching ""

    No results matching ""