#python+flask 播放视频+for循环的应用

  • 前期准备
    利用pycharm新建一个project(注意网页文档的位置与python文件的相对位置)
    请添加图片描述

案例:视频分镜头播放

1、利用python准备好所需的后端文件

#哈希算法:略
def hashcount():
    for i in range(449):
        img1 = cv2.imread('static/pic/image{}.jpg'.format(i))
        img2 = cv2.imread('static/pic/image{}.jpg'.format(i+1))
        hash1= aHash(img1)
        hash2= aHash(img2)
        n = cmpHash(hash1, hash2)
        if (n>20):
            print('均值哈希算法相似度:',n)
            cv2.imwrite('static/shot/image{}.jpg'.format(i+1),img2)
#计算分镜头的时间
def secondcount():
    for i in range(449):
        img1 = cv2.imread('static/pic/image{}.jpg'.format(i))
        img2 = cv2.imread('static/pic/image{}.jpg'.format(i+1))
        hash1= aHash(img1)
        hash2= aHash(img2)
        n = cmpHash(hash1, hash2)
        if (n>20):
            print('均值哈希算法相似度:',n)
            second_list.append(i)

2、构建flask框架

import os.path
from flask import Flask,render_template
import numpy as np

app=Flask(__name__)
@app.route('/')

def index():
    #return "Hi,Flask!"
    #return render_template('index.html')
    #所需依次展示的文件位置
    pic='static/shot/'
    path_list = os.listdir(pic)
    second = [3.1333333333333333, 4.3, 6.433333333333334, 9.133333333333333, 10.466666666666667, 12.066666666666666,
              13.3, 13.366666666666667]
    #与emplate文件夹中html文件对应
    return render_template('index.html', pic1=pic, path=path_list,second=second)

if "__main__"==__name__:
    app.run(port="1101")

3、在html中展示并设定播放的时间段

<div class="container">
        <input type="file" id="file" onchange="playMedia(5,15)">
        //读取pic文件夹中的已经经过分镜头的图片
        <h2>分镜头结果</h2>
        {% for i in path %}
        <img height="43.9" src="{{pic1}}{{i}}" />&nbsp;
        {% endfor %}
        
        //循环second列表中的分镜头时间,将开始时间重新设置
        {% for n in second %}
        <button onclick="setCurrentTime({{n}})" type="button">播放这一段</button>
        {% endfor %}

        {% for n in second %}
        <p style="font-size:5px">分镜头点时间:{{n}}</p>
        {% endfor %}

        <video id="video1" width="480" height="320" autoplay="autoplay" controls>
        </video>
        <br>
        <input type="text" id="showTime" value="显示当前播放时间"/>
 </div>
 <script>
    var myVid=document.getElementById("video1");
    myVid.addEventListener("timeupdate",timeupdate);
    var _endTime;

    //视频播放
    function playMedia(startTime,endTime){
        //设置结束时间
        _endTime = endTime;
       var file = document.getElementById("file").files[0];
       if(!file){
        alert("请指定视频路径");
        return false;
       }
       var url = (window.URL) ? window.URL.createObjectURL(file) : window.webkitURL.createObjectURL(file);
       myVid.src = url;
       myVid.controls = true;
       setTimeout("setCurrentTime('"+startTime+"')",200);
    }

    //设置视频开始播放事件
    function setCurrentTime(startTime){
        myVid.currentTime=startTime;
        myVid.play();
    }

    function timeupdate(){
        //因为当前的格式是带毫秒的float类型的如:12.231233,所以把他转成String了便于后面分割取秒
        var time = myVid.currentTime+"";
        document.getElementById("showTime").value=time;
        var ts = time.substring(0,time.indexOf("."));
        if(ts==_endTime){
            myVid.pause();
        }
    }
</script>

</body>

请添加图片描述

在线读取视频

def genFrame():
    image_save = 'D:\image\shot'

    if not (os.path.exists(image_save)):
        os.mkdir(image_save)

    cap = cv2.VideoCapture('ghz.mp4')
    _, img1 = cap.read()
 
    fc = cap.get(cv2.CAP_PROP_FRAME_COUNT)
   
    cv2.imwrite('D:\image\shot\image{}.jpg'.format(0), img1)
    #while(cap.isOpened()):       
    for i in range(int(fc)-1):                               
        _, img2 = cap.read()
        #cv2.imshow("img",img2)
        hash1 = aHash(img1)
        hash2 = aHash(img2)
        n = cmpHash(hash1, hash2)
        print (n)
        if n<0.4:
            print(n)
            cv2.imwrite('D:\image\shot\image{}.jpg'.format(i), img2)
            img1=img2
genFrame()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值