【V2EX】利用 b 站二压, 30fps 和 60fps 下显示不同的画面

bilibili 视频处理 v2ex 文章 2024-07-04 08:35 122 0 全屏看文

AI助手支持GPT4.0

效果图

简单来说,当一个高 FPS 的视频压缩为较低 FPS 的视频时,会选择某些帧作为关键帧插入。

B 站提供了 30fps 或 60fps 的视频。

因此,我们可以创建一个 120fps 的视频,然后在第1+4n 帧插入你希望在 30fps 下显示的内容,其余帧则插入你希望在 60fps 下显示的内容。

这样,在阿 b 二压后,30fps 和 60fps 的视频就会显示不同的画面。

至于“1+4n”这个公式的由来。

可以首先制作一个每帧都标有序号的 120fps 视频。然后使用 ffmpeg 将视频转换为 30fps ,观察哪些帧被保留,从而确定关键帧。

proof of concept

懒得传 gist 了

import cv2

class Fps120FrameReader:
    def __init__(self, filename):
        self.src = cv2.VideoCapture(filename)
        self.framerate = int(self.src.get(cv2.CAP_PROP_FPS))
        if self.framerate not in [30,60,120]:
            raise Exception(f"not support frame rate other than 30, 60, 120, framerate {self.framerate}")
        self.current_frame = 0
        self.frame = None

    def read(self):
        if self.current_frame % (120 // self.framerate) == 0:
            ok, self.frame = self.src.read()
            if not ok:
                self.frame = None
        self.current_frame +=1
        return self.frame

    def close(self):
        return self.src.release()

    @property
    def size(self):
        return int(self.src.get(cv2.CAP_PROP_FRAME_WIDTH)),int(self.src.get(cv2.CAP_PROP_FRAME_HEIGHT))



readerA = Fps120FrameReader('igotsmoke.mp4')
readerB = Fps120FrameReader('benkui.mp4')

assert readerA.size == readerB.size

fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output_video_C.mp4', fourcc, 120, readerA.size)

frame_count = 0
while True:
    frameA = readerA.read()
    frameB = readerB.read()

    if frameA is None or frameB is None:
        break

    if frame_count % 4 == 1:
        out.write(frameA)
    else:
        out.write(frameB)

    frame_count += 1

readerA.close()
readerB.close()
out.release()

print("ok")


原文出自:https://v2ex.com/t/1054464

-EOF-

AI助手支持GPT4.0


国内超级便宜服务器

摸鱼人热门新闻聚合

钻级赞助商 我要加入

开发者在线工具

第三方支付技术请加QQ群

相关文章
wecenter bilibili视频插件演示
两行前端代码搞定bilibili链接转视频(支持wecenter,wordpress,discuz,typecho)
wordpress B站视频解析插件
B站修改头像为gif
无需ffpmeg合并m4s文件为mp4的方法
随便看看
input组件使用model:value 爆了一堆警告? 465
网页授权同意之后,微信没有回调过来? 790
小程序审核不通过? 321
微信小程序是什么?小程序开发代码知识科普! 407
云开发如何突破数据库获取条数限制? 495
Vue的router-link样式处理 1008
小游戏能否开放连续相关接口,用wx.getLocation有频次限制,不适合定位导航类的项目 459
小游戏迁移,原主体是个人,上传身份证需要正反两面吗? 484
游戏警告后整改版本已经通过并且已经申诉成功,第二天又封禁? 324
在电脑上做出来的场景用手机扫描后不匹配,看不到所有的场景怎么解决啊?球球啦 330