一个欲儿的博客

一个欲儿的博客

关于GeForce Experience录制的游戏视频出现屏闪的现象怎么解决
2023-08-08

操作流程已经在哔站上传视频,博客若看不懂,可以查阅视频喔



先说一下问题是怎么产生的

很多人或许会像我一样打游戏的时候会把N卡自带的显示帧率功能打开并且放在屏幕左上角,但是这个就是万恶之源,把所有能展示的都关闭了就不会再出现任何问题了

image.png



然后在D盘新建两个文件夹,第一个叫001 第二个叫yuervideo

image.png


用pr的方式把视频导出为一帧一帧的图片。具体方法为:先导入视频,选中,点文件,选中导出(导出到  D://001 ),选择格式为png即可

image.png

再全选D://001下的所有图片把文件名字重命名为任意名字即可

image.png


所有源码均为python文件哈,如果不会运行python的话可以在网上百度教程,当然视频里面介绍的也比较详细!

去除黑帧源码:

#去除黑帧
import cv2
import os

#切记路径不能含中文 文件名字也不能含中文

path = "D://001"
for file in os.listdir(path):
    filename = path + "/"+file
    img = cv2.imread(filename)
    colors = cv2.mean(img)
    point = (colors[0] + colors[1] + colors[2] ) / 3
    if(point < 1):
        os.remove(filename)
        print(filename+"-已删除")
print("黑帧清除完毕")



帧合并为视频(补帧):

#帧合并为视频(补帧)
import cv2
import os

def images_to_video():
    path = "D://001"                          # 帧图片所在文件夹
    fps = 60                               # 帧率(1秒钟多少张图片)
    num = len(os.listdir(path))
    newfile = "D://yuervideo/result.avi"      # 生成的视频的路径(必须.avi)
    onename = "D://001/xyy (yuer).png"       # 单张图片的路径 数字用yuer替换
    img_array = []
    img_width = 1920                          # 每帧宽度
    img_height = 1080                         # 每帧高度
    buff = 800                               # 一次处理多少张图片(防止内存太多导致卡死)
    ret = 0
    time = int(num / buff + 1)
    print("处理次数:",time)
    for i in range(time):
        #计算每一次开始图片序列号
        ret = i * buff
        #清零图片数组
        img_array = []
        for a in range(buff):
            if((a + ret)>num):
                break
            else:
                #filename = "D://001/demo ("+str(a + ret)+").png"
                filename = onename.replace("yuer",str(a + ret))
                img = cv2.imread(filename)
                if img is None:
                    print(filename + "不存在")
                    print("开始寻找前一真帧")
                    for dx in range(buff):
                        #filename = "D://001/demo ("+str(a + ret-dx)+").png"
                        filename = onename.replace("yuer",str(a + ret-dx))
                        if(a + ret-dx < 0):
                            break
                        else: 
                            img = cv2.imread(filename)
                            if img is None:
                                print("前"+ str(dx)+ "帧仍为虚帧")
                                continue
                            else:
                                img_array.append(img)
                                print("前"+ str(dx)+ "为真帧且已载入")
                                break
                else:
                    print(filename + "已载入")
                img_array.append(img)
        out = cv2.VideoWriter(newfile[0:-4]+str(i)+".avi", cv2.VideoWriter_fourcc(*'DIVX'), fps,(img_width,img_height))
        for i in range(len(img_array)):
            out.write(img_array[i])
            print(onename.replace("yuer",str(ret+i)),"已写入")
        out.release()



def main():
    images_to_video()
    print("完成")
 
if __name__ == "__main__":
    main()



帧合并为视频(不补帧):

#帧合并为视频(不补帧)
import cv2
import os
def images_to_video():
    path = "D://001"                          # 帧图片所在文件夹
    fps = 30                # 帧率(1秒钟多少张图片)
    num = len(os.listdir(path))
    newfile = "D://yuervideo/result.avi"      # 生成的视频的路径(必须.avi)
    onename = "D://001/ret (yuer).png"       # 单张图片的路径 数字用yuer替换
    img_array = []
    img_width = 1920        # 每帧宽度
    img_height = 1080       # 每帧高度
    buff = 2000             # 一次处理多少张图片(防止内存太多导致卡死)
    ret = 0
    time = int(num / buff + 1)
    print("处理次数:",time)
    for i in range(time):
        #计算每一次开始图片序列号
        ret = i * buff
        #清零图片数组
        img_array = []
        for a in range(buff):
            if((a + ret)>num):
                break
            else:
                filename = onename.replace("yuer",str(a + ret))
                img = cv2.imread(filename)
                if img is None:
                    print(filename + "不存在")
                    continue
                else:
                    print(filename + "已载入")
                img_array.append(img)
        out = cv2.VideoWriter(newfile[0:-4]+str(i)+".avi", cv2.VideoWriter_fourcc(*'DIVX'), fps,(img_width,img_height))
        for i in range(len(img_array)):
            out.write(img_array[i])
            print(onename.replace("yuer",str(ret+i)),"已写入")
        out.release()



def main():
    images_to_video()
    print("完成")
 
if __name__ == "__main__":
    main()



视频合并:

#视频合并
import cv2
import os
def concat_videos(video_paths, output_path):
    # 读取第一个视频
    cap1 = cv2.VideoCapture(video_paths[0])
    frame_width = int(cap1.get(3))
    frame_height = int(cap1.get(4))
    fps = int(cap1.get(5))

    # 创建VideoWriter对象来保存合并后的视频
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))

    # 逐帧读取并写入第一个视频
    while cap1.isOpened():
        ret, frame = cap1.read()
        if not ret:
            break
        out.write(frame)

    # 释放第一个视频
    cap1.release()

    # 逐帧读取并写入第二个视频
    for video_path in video_paths[1:]:
        cap2 = cv2.VideoCapture(video_path)
        while cap2.isOpened():
            ret, frame = cap2.read()
            if not ret:
                break
            out.write(frame)
        cap2.release()

    # 释放输出视频
    out.release()

def main():    
    time = 17
    for i in range(time-1):
        file1 = 'result' + str(i) + ".avi"
        file2 = 'result' + str(i+1) + ".avi"
        newfile = 'newavi.avi'
        print(file1,file2)
        video_paths = [file1, file2]  # 要拼接的视频路径列表
        output_path = newfile
        concat_videos(video_paths, output_path)
        os.remove(file2)
        os.rename(newfile,file2)
        os.remove(file1)
    print("视频拼接完成!")

if __name__ == "__main__":
    main()


发表评论: