2024-05-07 19:58:01 +08:00
|
|
|
import time
|
|
|
|
|
2024-02-19 20:03:04 +08:00
|
|
|
from lib.all import *
|
|
|
|
import ffmpy
|
2024-05-07 14:14:06 +08:00
|
|
|
import cv2
|
|
|
|
import oss2
|
2024-02-19 20:03:04 +08:00
|
|
|
|
2024-05-07 19:58:01 +08:00
|
|
|
service_name = 'vd_compress'
|
|
|
|
# log_dir = '/app/log'
|
|
|
|
log_dir = '/Users/erwin/data/log'
|
|
|
|
logger = Logger(service_name, log_dir=log_dir)
|
|
|
|
|
2024-05-07 14:14:06 +08:00
|
|
|
# input_file = "h264_origin.mp4"
|
|
|
|
# output_file = "h265_origin.mp4"
|
|
|
|
# #
|
|
|
|
# ff = ffmpy.FFmpeg(
|
|
|
|
# inputs={input_file: None},
|
|
|
|
# outputs={output_file: '-c:v libx265'}
|
|
|
|
# )
|
|
|
|
# #
|
|
|
|
# ff.run()
|
2024-02-19 20:03:04 +08:00
|
|
|
|
2024-05-07 14:14:06 +08:00
|
|
|
access_key_id = "LTAI5tAdu5LRvZwm4LJa21Fo"
|
|
|
|
access_key_secret = "WGvSQsDralTfFAAxhEqLBOgbXqflHo"
|
|
|
|
endpoint_internal = "https://oss-cn-hangzhou.aliyuncs.com"
|
|
|
|
bucket_name = "wishpal-ironfan-media"
|
2024-02-19 20:03:04 +08:00
|
|
|
|
2024-05-07 14:14:06 +08:00
|
|
|
|
|
|
|
def get_video_w_h(path):
|
|
|
|
video = cv2.VideoCapture(path)
|
|
|
|
|
|
|
|
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
|
|
|
|
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
|
|
|
|
|
|
|
# 横屏 960 * 540
|
|
|
|
if width > height:
|
|
|
|
rate = float(720) / float(height)
|
|
|
|
new_width = int(float(width) * rate)
|
|
|
|
new_height = 720
|
|
|
|
else:
|
|
|
|
rate = float(720) / float(width)
|
|
|
|
new_width = 720
|
|
|
|
new_height = int(float(height) * rate)
|
|
|
|
|
|
|
|
return width, height, new_width, new_height
|
|
|
|
|
|
|
|
|
|
|
|
# video_path = "bbbbb.mov"
|
|
|
|
# print(get_video_w_h(video_path))
|
|
|
|
|
|
|
|
|
|
|
|
class S:
|
|
|
|
def __init__(self):
|
|
|
|
self.bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint_internal, bucket_name)
|
|
|
|
self.url_get_videos_by_status = "https://api.tiefen.fun/op/media/get_videos_by_status"
|
2024-05-07 19:58:01 +08:00
|
|
|
self.url_update_video_compress = "https://api.tiefen.fun/op/media/update_video_compress"
|
2024-05-07 14:14:06 +08:00
|
|
|
self.hw_cdn_host = "https://filecdnhw01.tiefen.fun/"
|
|
|
|
|
|
|
|
def save_video_from_oss(self, oss_src_id: str, local_path: str):
|
|
|
|
return self.bucket.get_object_to_file(oss_src_id, local_path)
|
|
|
|
|
|
|
|
def upload_video_to_oss(self, local_path: str, oss_src_id: str):
|
|
|
|
return self.bucket.put_object_from_file(oss_src_id, local_path)
|
|
|
|
|
|
|
|
def get_one_wait_compress_video(self):
|
|
|
|
param = {
|
2024-05-07 19:58:01 +08:00
|
|
|
# "ids": [23431],
|
2024-05-07 14:14:06 +08:00
|
|
|
"status": 0,
|
|
|
|
"offset": 0,
|
|
|
|
"limit": 1,
|
|
|
|
}
|
|
|
|
res = call_service(self.url_get_videos_by_status, param)
|
|
|
|
data = safe_get_dict(res, "data")
|
|
|
|
lis = safe_get_list(data, "video")
|
|
|
|
if len(lis) > 0:
|
|
|
|
return lis[0]
|
|
|
|
return None
|
|
|
|
|
2024-05-07 19:58:01 +08:00
|
|
|
def set_compress_finish(self, video_id, size_src, src_id_h264, size_h264, status, resize_t):
|
|
|
|
param = {
|
|
|
|
"id": video_id,
|
|
|
|
"size_src": size_src,
|
|
|
|
"src_id_h264": src_id_h264,
|
|
|
|
"size_h264": size_h264,
|
|
|
|
"status": status,
|
|
|
|
"resize_t": resize_t,
|
|
|
|
}
|
|
|
|
logger.Info("{}".format(dict2json(param)))
|
|
|
|
res = call_service(self.url_update_video_compress, param)
|
|
|
|
ret = safe_get_int(res, "ret")
|
|
|
|
return ret
|
|
|
|
|
2024-05-07 14:14:06 +08:00
|
|
|
def proc_one(self):
|
|
|
|
video = self.get_one_wait_compress_video()
|
|
|
|
if not video:
|
|
|
|
return
|
|
|
|
|
|
|
|
video_id = safe_get_int(video, "id")
|
|
|
|
src_id = safe_get_str(video, "src_id")
|
2024-05-07 19:58:01 +08:00
|
|
|
src_id_h264 = src_id.replace("vdprod", "vdprodh264")
|
2024-05-07 14:14:06 +08:00
|
|
|
src_id_python_type = src_id.replace("/", "_")
|
2024-05-07 19:58:01 +08:00
|
|
|
src_id_h264_python_type = src_id_h264.replace("/", "_")
|
2024-05-07 14:14:06 +08:00
|
|
|
|
|
|
|
cur_dir = os.getcwd() + "/"
|
|
|
|
local_src_path = cur_dir + src_id_python_type
|
2024-05-07 19:58:01 +08:00
|
|
|
local_h264_path = cur_dir + src_id_h264_python_type
|
2024-05-07 14:14:06 +08:00
|
|
|
|
|
|
|
# 下载视频到本地
|
|
|
|
obj = self.save_video_from_oss(src_id, local_src_path)
|
|
|
|
content_type = safe_get_str(obj.headers, "Content-Type")
|
|
|
|
file_size = int(safe_get_str(obj.headers, "Content-Length"))
|
|
|
|
local_src_path_new = local_src_path
|
|
|
|
if content_type == "video/mp4":
|
|
|
|
local_src_path_new = local_src_path + ".mp4"
|
|
|
|
elif content_type == "video/quicktime":
|
|
|
|
local_src_path_new = local_src_path + ".mov"
|
|
|
|
else:
|
2024-05-07 19:58:01 +08:00
|
|
|
logger.Info("invalid content_type, id: {}, src_id: {}, content_type: {}", video_id, self.hw_cdn_host + src_id, content_type)
|
2024-05-07 14:14:06 +08:00
|
|
|
return
|
|
|
|
os.renames(local_src_path, local_src_path_new)
|
|
|
|
|
|
|
|
# 转成264 mp4
|
|
|
|
input_file = local_src_path_new
|
2024-05-07 19:58:01 +08:00
|
|
|
output_file = local_h264_path + ".mp4"
|
2024-05-07 14:14:06 +08:00
|
|
|
ff = ffmpy.FFmpeg(
|
|
|
|
inputs={input_file: None},
|
|
|
|
outputs={output_file: '-c:v libx264'}
|
|
|
|
)
|
|
|
|
ff.run()
|
|
|
|
|
2024-05-07 19:58:01 +08:00
|
|
|
# 上传
|
|
|
|
upload_ret = self.upload_video_to_oss(output_file, src_id_h264)
|
|
|
|
upload_ret_status = upload_ret.status
|
|
|
|
logger.Info("upload_ret, {}, {}".format(src_id, upload_ret_status))
|
|
|
|
output_content_type = "video/mp4"
|
|
|
|
output_file_size = os.path.getsize(output_file)
|
|
|
|
|
|
|
|
# 更新db
|
|
|
|
db_ret = self.set_compress_finish(video_id, file_size, src_id_h264, output_file_size, 100, int(time.time()))
|
|
|
|
|
|
|
|
os.remove(input_file)
|
|
|
|
os.remove(output_file)
|
|
|
|
|
|
|
|
logger.Info("before, {}, {}, {}".format(src_id, content_type, file_size))
|
|
|
|
logger.Info("after_h264, {}, {}, {}, {}".format(src_id_h264, output_content_type, output_file_size, db_ret))
|
|
|
|
logger.Info("host: {}".format(self.hw_cdn_host + src_id_h264))
|
|
|
|
|
|
|
|
|
|
|
|
def get_video_stat(video_path):
|
|
|
|
video = cv2.VideoCapture(video_path)
|
|
|
|
|
|
|
|
# 获取视频帧数
|
|
|
|
total_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
|
|
|
|
|
|
|
|
# 获取视频帧率
|
|
|
|
fps = video.get(cv2.CAP_PROP_FPS)
|
|
|
|
|
|
|
|
# 获取视频宽度和高度
|
|
|
|
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
|
|
|
|
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
|
|
|
|
|
|
|
print(video_path)
|
|
|
|
print(f"帧数: {total_frames}")
|
|
|
|
print(f"帧率: {fps}")
|
|
|
|
print(f"宽度: {width}")
|
|
|
|
print(f"高度: {height}")
|
2024-05-07 14:14:06 +08:00
|
|
|
|
|
|
|
|
|
|
|
s = S()
|
2024-05-07 19:58:01 +08:00
|
|
|
while True:
|
|
|
|
s.proc_one()
|
|
|
|
# get_video_stat("vdprod_7b_09_f8c4-bd63-4d4a-898b-6d1431f06994.mov")
|
|
|
|
# get_video_stat("vdprod_7b_09_f8c4-bd63-4d4a-898b-6d1431f06994.mp4")
|