使用Golang实现视频流

准备:go环境, FFMPEG,一个视频

使用命令:

1
ffmpeg -i code.mp4 -profile:v baseline -level 3.0 -s 640x360 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls index.m3u8

使用ffmpeg命令将视频分为一个.m3u8和多个.ts文件

并将文件放在目录assets\media1\hls

文件 main.go 代码:

阅读更多

关于linux:Python进程,OSError[Errno 12]无法分配内存

在一台Linux服务器下运行 Python 脚本,报了如下错误:

1
sp.Popen self.pid = _posixsubprocess.fork_exec( OSError: [Errno 12] Cannot allocate m

于是尝试 用 free -m ,查看服务器内存情况

1
2
watch -n 2 free -m
全程监视电脑CPU、GPU,以及物理内存、交换区内存的变化情况
阅读更多

Python自动上传视频到YouTube

这边有个需求就是实现,自动上传视频到youtube上,我这次试用的语言是Python,网上找了一些资料,选择了github上的一个项目:https://github.com/tokland/youtube-upload

先贴下谷歌开发者文档:https://developers.google.com/youtube/registering_an_application

https://developers.google.com/apis-explorer

阅读 youtube-upload 上的说明,按照以下步骤进行实现:

安装 依赖包:

1
pip3 install --upgrade google-api-python-client oauth2client progressbar2
阅读更多

CentOS下编译安装ffmpeg 并向YouTube推流

准备一台海外服务器,我使用 vultr

安装 yasm

1
2
3
4
5
6
wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar -xvf /yasm-1.3.0.tar.gz
cd /yasm-1.3.0
./configure --prefix=/usr/local
make
make install
阅读更多

1
#!/bin/bash

echo是用于终端打印的最基本命令。echo在每次调用后会添加一个换行符。

可以使用双引号、单引号或者不用引号。

双引号允许shell解释字符串中出现的特殊字符。单引号不会对其做任何解释。

1
echo "welcom to bash"
阅读更多

cat命令

1、cat命令能够显示或拼接文件内容

1
2
3
4
# 格式:cat file1 file2 file3 ...
cat debug.sh sleep.sh

echo "hello shell" | cat temp.txt
阅读更多

一道MySQL查询题目

题目:有三张表:学生表 student,科目表:course,成绩表:grade。要求展示如下结果:

image-20211008175900619

阅读更多

使用moviepy组合SRT字幕文件和视频

有个视频需求,需要自动化的将字幕文件和视频组合在一起,这里选择的是moviepy,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

import re
from os.path import splitext, isfile

from moviepy.editor import (VideoFileClip,
TextClip,
CompositeVideoClip)


# 读取字幕文件
def read_srt(path):
content = ""
with open(path, 'r', encoding='UTF-8') as f:
content = f.read()
return content


# 字幕拆分
def get_sequences(content):
sequences = content.split('\n\n')
sequences = [sequence.split('\n') for sequence in sequences]
# 去除每一句空值
sequences = [list(filter(None, sequence)) for sequence in sequences]
# 去除整体空值
return list(filter(None, sequences))

# 转换时间
def strFloatTime(tempStr):
xx = tempStr.split(':')
hour = int(xx[0])
minute = int(xx[1])
second = int(xx[2].split(',')[0])
minsecond = int(xx[2].split(',')[1])
allTime = hour * 60 * 60 + minute * 60 + second + minsecond / 1000
return allTime

class RealizeAddSubtitles():
'''
合成字幕与视频
'''

def __init__(self, videoFile, txtFile):
self.src_video = videoFile
self.sentences = txtFile
if not (isfile(self.src_video) and self.src_video.endswith(('.avi', '.mp4')) and isfile(
self.sentences) and self.sentences.endswith('.srt')):
print('视频仅支持avi以及mp4,字幕仅支持srt格式')
else:
video = VideoFileClip(self.src_video)
# 获取视频的宽度和高度
w, h = video.w, video.h
# 所有字幕剪辑
txts = []
content = read_srt(self.sentences)
sequences = get_sequences(content)

# print(sequences)

# exit()

for line in sequences:
if len(line)<3:
continue
sentences = line[2]
start = line[1].split(' --> ')[0]
end = line[1].split(' --> ')[1]

start=strFloatTime(start)
end=strFloatTime(end)

start, end = map(float, (start, end))
span=end-start
# 超过24个字符则换行
if len(sentences) > 24:
zmstr = re.findall(r'.{24}', sentences)
zmstr.append(sentences[(len(zmstr) * 24):])
print(zmstr)
sentences = zmstr[0] + "\n" + zmstr[1]
# #ddddff
# https://moviepy-tburrows13.readthedocs.io/en/improve-docs/ref/VideoClip/TextClip.html

# stroke_color描边颜色,stroke_width 描边宽度, bg_color="red"
txt = (TextClip(sentences, fontsize=40,
font='SimHei', size=(w - 20, 80),
align='center', color='#FFF', stroke_color="black", stroke_width=2)
.set_position((10, h - 150))
.set_duration(span)
.set_start(start))

txts.append(txt)
# 合成视频,写入文件
video = CompositeVideoClip([video, *txts])
fn, ext = splitext(self.src_video)
video.write_videofile(f'{fn}_2带字幕{ext}')


if __name__ == '__main__':
'''调用方法示例'''
srt_path = 'go2.srt'
addSubtitles = RealizeAddSubtitles('go2.mp4', srt_path)

Linux上搭建Go环境

下载安装包,选择 Linux 版本:https://golang.org/dl/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# wget 下载
wget https://golang.org/dl/go1.17.3.linux-amd64.tar.gz
# 解压到指定目录 /usr/local/
tar -zxvf go1.17.3.linux-amd64.tar.gz -C /usr/local/
# 进入/usr/local/,创建 Go 项目存放路径 gocode
cd /usr/local/
mkdir gocode
# 配置环境变量
vim /etc/profile
# 在文件末尾添加以下内容
export GOROOT=/usr/local/go
export GOPATH=/usr/local/gocode
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
# 使环境变量 生效
source /etc/profile
# 最后查看 Go 版本 和 配置信息
go version
go env

# 如下
GOROOT="/usr/local/go"
GOPATH="/usr/local/gocode"

yum 安装

1
2
3
yum install epel-release
yum install golang
go version

2021年09月

🌞 🌞 🌞 Hi,你好

这里是苏小怪的“碎碎语”板块,用于记录平时的所闻所想。

🍀2021.09.30

尝试将所有问题自己闭环解决,闭环 + Think Bigger + 沉淀原则。

🍀2021.09.29

认识世界的苦,了解痛苦,才能直面它。佛说人生有八苦:生老病死,怨憎会,爱离别,求不得,五阴炽盛。

阅读更多