0%

根据主视频,自动设置片头的分辨率、Fps、编码器

根据主视频,自动设置片头的分辨率、Fps、编码器:

  • 前提:
    • 安装:ffmpeg
    • 安装:python库 opencv-python pip3 install opencv-python
def set_start_video(self, video_path, start_video_path):
"""
:param video_path: 原始mp4 绝对路径
:param start_video_path: 片头的绝对路径
:return:
"""
video = cv2.VideoCapture(f"{video_path}")
# print(height, width)
# resolution1 = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
# print(resolution1)

# 获取高度
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 获取宽度
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))

# 获取帧率
fps = video.get(cv2.CAP_PROP_FPS)

# # 向上取整
# fps_a = math.ceil(fps)

# 保留2位小数
fps_a = '%.2f' % fps
# "ffmpeg -i a.mp4 -r 30 b.mp4"
# print(fps_a)

# 退出cv2
video.release()
cv2.destroyAllWindows()

# 开始获取编码器 因为我的本地opencv库版本低,尝试获取编码器格式失败,所以这里用另一种方式获取
command = f"ffprobe -v quiet -select_streams v:0 -show_entries stream=codec_name -of default '{video_path}/v1.mp4'"
result = subprocess.run(command, shell=True, stdout=subprocess.PIPE)
encoder = result.stdout.decode().strip()
new_encoder = re.search("codec_name=(?P<codec_name>.*?)\n", encoder)

# 编写执行命令字符串
cmd_str = f"ffmpeg -i {start_video_path} -vf scale={width}:{height} -r {fps_a} -acodec aac -vcodec {new_encoder.group('codec_name')} {video_path}/xxx.ts" # 这里的xxx.ts 就是我们根据主视频修改后的片头
# 开始执行命令
os.system(cmd_str)