IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Http通讯+ffmpeg视频提取+Json数据提取——实现Http发送Json数据利用ffmpeg实现MobaXterm终端每隔一定时间段提取视频和图片 -> 正文阅读

[网络协议]Http通讯+ffmpeg视频提取+Json数据提取——实现Http发送Json数据利用ffmpeg实现MobaXterm终端每隔一定时间段提取视频和图片

实现Http发送Json数据利用ffmpeg实现MobaXterm终端每隔一定时间段提取视频和图片

1.使用到的软件

  • VS Code:python编程软件
  • Postman:用于发送Http请求
  • MobaXterm终端:用于连接RK3399板子

2.代码

from ast import And
import socket
import json
import os
from time import sleep
# import cv2 
import numpy as np
import subprocess


def get_video_duration(video_path: str):
    ext = os.path.splitext(video_path)[-1]
    if ext != '.mp4' and ext != '.avi' and ext != '.flv' and ext != '.ts':
        raise Exception('format not support')
    # -show_entries stream=width,height
    ffprobe_cmd = 'ffprobe -i {} -show_entries format=duration -v quiet -of csv="p=0"'
    p = subprocess.Popen(
        ffprobe_cmd.format(video_path),
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        shell=True)
    out, err = p.communicate()
    duration_info = float(str(out, 'utf-8').strip())
    return int(duration_info)


'''
调用方式:
1.先启动服务器
2.打开postman
3.选择传方式为post,输入网址:http://127.0.0.1:8000
4.输入发送内容(案例):
{"time":"20220405-173000","video_save_path":"C:/Users/pc/Desktop/20220922erro_photo_get/test_vedio/vedio","save_path":"C:/Users/pc/Desktop/20220922erro_photo_get/test_vedio/save/","time_interval":2,"img_number":7}
5.点击发送即可
'''

################################################################## 接受http请求并在相关文件夹中查找符合条件的视频文件观察是否存在 #############################################################

file_name_list=[]
video_path=""
# 获取字段中的key所对应的value
def get_dict_value(in_dict, target_key, results=[], not_d=True):
    for key in in_dict.keys():  # 迭代当前的字典层级
        data = in_dict[key]  # 将当前字典层级的第一个元素的值赋值给data
        
		# 如果当前data属于dict类型, 进行回归
        if isinstance(data, dict):
            get_dict_value(data, target_key, results=results, not_d=not_d)
            
		# 如果当前键与目标键相等, 并且判断是否要筛选
        if key == target_key and isinstance(data, dict) != not_d:
            results.append(in_dict[key])

    return results

# 全0为网络地址
host='0.0.0.0'
#定义端口号
port=8000
addr=(host,port)

# 创建socket 配置socket协议簇为AF_INET,连接类型为长连接SOCK_STREAM
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
# 将创建的socket绑定到上面的服务地址
s.bind(addr)
    
# 设置可接收的最大连接数
s.listen(3)
    
# 同步等待客户端的主动连接,并读取客户端发来的信息

while True:

    con, addr = s.accept()
    request = con.recv(2048)

    # 更改编码方式
    str_1=str(request,encoding='utf-8')

    for i in range(len(str_1)):
        if str_1[i]=='{':
            flag_1=i
        elif str_1[i]=='}':
            flag_2=i


    str_2="{"+str_1[flag_1+1:-1]+"}"

    print(str_2,"type=",type(str_2))

    json_str_data=json.loads(str_2)

    # 提取内容得到list
    img_path_data = get_dict_value(json_str_data,'time',results=[])
    video_save_path_data =get_dict_value(json_str_data,'video_save_path',results=[])
    save_path_data=get_dict_value(json_str_data,'save_path',results=[])
    time_interval_data=get_dict_value(json_str_data,'time_interval',results=[])
    img_number_data=get_dict_value(json_str_data,'img_number',results=[])
    

    # 得到真实内容
    gain_video_time=img_path_data[0]
    video_save_path=video_save_path_data[0]
    save_path=save_path_data[0]
    # 传入时间间隔参数单位为s
    time_interval=time_interval_data[0]
    img_number=img_number_data[0]


    # 获取文件夹中的所有文件名整合为list
    for root, dirs, files in os.walk(video_save_path):
            
        # print(root)     # 输出当前的文件夹路径
        # print(dirs)     # 当前文件夹路径下所有子文件夹名
        file_name_list=files
        #print(files)    # 当前路径下所有非目录子文件
        #for file_name in 

    # 对比文件名
    for video_file_name in file_name_list:
        #print(vedio_file_name)
        filename=video_file_name.split('.')
        if filename[0]==gain_video_time :
                
            video_path=video_save_path+"/"+video_file_name

            #查看输出
            #print(video_path)
            
            # else:
            #     print("文件不存在")

    if video_path=="":
        print("文件不存在,未找到!!!")
    else:
        print("文件存在,已找到!!!")

    ######################################################################### 找到文件后处理相关视频文件###################################################################
    '''
    cap=cv2.VideoCapture(video_path)

    if cap!=0:
        print("打开视频成功")
    else:
        print("打开视频失败")

    n_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  ##视频的帧数
    fps = cap.get(cv2.CAP_PROP_FPS)  ##视频的帧率

    #输入时间根据时间计算所要跳转的帧数,单位ms
    frameRate = int(fps) * time_interval * 60
    time = n_frames / fps
    '''

    time=get_video_duration(video_path)
    print("time=",time)

    #定义开始时间单位min
    frame_time=0

    #定义img序号
    currentFrame = 0

    # 新建同名文件用于保存2s视频
    str_system_2="mkdir "+save_path+gain_video_time
    os.system(str_system_2)


    while True:    

        if frame_time < time and currentFrame<img_number:
            print("正在截取第",frame_time,"秒的图片")
            
            # ffmpeg -i /udisk/hdd/04/2022-09-25_120000.mp4 -ss 00:01:00 -t 2 -vcodec copy tmp_copy.ts && ffmpeg -i tmp_copy.ts -y -f image2 -ss 00:00:00 -vframes 1  test.jpg && rm -f tmp_copy.ts

            if frame_time<10:
                str_system='ffmpeg -i'+' '+video_path+' '+'-ss 00:00:0'+str(frame_time)+' '+'-t 2'+' '+'-c copy'+' '+save_path+gain_video_time+'/'+str(currentFrame)+'.ts'+' && ffmpeg -i '+save_path+gain_video_time+'/'+str(currentFrame)+'.ts -y -f image2 -ss 00:00:00 -vframes 1'+' '+save_path+gain_video_time+'/'+str(currentFrame)+'.jpg'+' '+'&& rm -f '+save_path+gain_video_time+'/'+str(currentFrame)+'.ts'
            
            elif frame_time<60:
                str_system='ffmpeg -i'+' '+video_path+' '+'-ss 00:00:'+str(frame_time)+' '+'-t 2'+' '+'-c copy'+' '+save_path+gain_video_time+'/'+str(currentFrame)+'.ts'+' && ffmpeg -i '+save_path+gain_video_time+'/'+str(currentFrame)+'.ts -y -f image2 -ss 00:00:00 -vframes 1'+' '+save_path+gain_video_time+'/'+str(currentFrame)+'.jpg'+' '+'&& rm -f '+save_path+gain_video_time+'/'+str(currentFrame)+'.ts'
            
            elif frame_time<3600:
                # 获取分钟数
                min_data=frame_time//60

                # 获取秒数       
                sec_data=frame_time%60
                
                # 构造str_system主要是起始时间设定
                if min_data<10 and sec_data<10:
                    str_system='ffmpeg -i'+' '+video_path+' '+'-ss 00:0'+str(min_data)+':0'+str(sec_data)+' '+'-t 2'+' '+'-c copy'+' '+save_path+gain_video_time+'/'+str(currentFrame)+'.ts'+' && ffmpeg -i '+save_path+gain_video_time+'/'+str(currentFrame)+'.ts -y -f image2 -ss 00:00:00 -vframes 1'+' '+save_path+gain_video_time+'/'+str(currentFrame)+'.jpg'+' '+'&& rm -f '+save_path+gain_video_time+'/'+str(currentFrame)+'.ts'
                elif min_data<10 and sec_data>10:
                    str_system='ffmpeg -i'+' '+video_path+' '+'-ss 00:0'+str(min_data)+':'+str(sec_data)+' '+'-t 2'+' '+'-c copy'+' '+save_path+gain_video_time+'/'+str(currentFrame)+'.ts'+' && ffmpeg -i '+save_path+gain_video_time+'/'+str(currentFrame)+'.ts -y -f image2 -ss 00:00:00 -vframes 1'+' '+save_path+gain_video_time+'/'+str(currentFrame)+'.jpg'+' '+'&& rm -f '+save_path+gain_video_time+'/'+str(currentFrame)+'.ts'
                elif min_data>10 and sec_data<10:
                    str_system='ffmpeg -i'+' '+video_path+' '+'-ss 00:'+str(min_data)+':0'+str(sec_data)+' '+'-t 2'+' '+'-c copy'+' '+save_path+gain_video_time+'/'+str(currentFrame)+'.ts'+' && ffmpeg -i '+save_path+gain_video_time+'/'+str(currentFrame)+'.ts -y -f image2 -ss 00:00:00 -vframes 1'+' '+save_path+gain_video_time+'/'+str(currentFrame)+'.jpg'+' '+'&& rm -f '+save_path+gain_video_time+'/'+str(currentFrame)+'.ts'
                else:
                    str_system='ffmpeg -i'+' '+video_path+' '+'-ss 00:'+str(min_data)+':'+str(sec_data)+' '+'-t 2'+' '+'-c copy'+' '+save_path+gain_video_time+'/'+str(currentFrame)+'.ts'+' && ffmpeg -i '+save_path+gain_video_time+'/'+str(currentFrame)+'.ts -y -f image2 -ss 00:00:00 -vframes 1'+' '+save_path+gain_video_time+'/'+str(currentFrame)+'.jpg'+' '+'&& rm -f '+save_path+gain_video_time+'/'+str(currentFrame)+'.ts'


            os.system(str_system)

            frame_time=frame_time+time_interval

            #currentFrame=currentFrame+frameRate*1000
            currentFrame=currentFrame+1

        else:
            print("该视频已经截取完\n")
            #sleep(5)
            break
    con.close()

3.代码简单讲解

  • get_dict_value函数:用于传来的Json数据的键值对(key-value)
  • 0.0.0.0:为网络地址,使得HTTP发送方与HTTP接收方能够建立起通讯
  • port=8000:为指定端口号
  • while循环中,使用了ffmpeg系统命令,通过Pythonos库中的system接口来实现

4. 细节

  • 本代码实现了对于每隔固定时长提取2s视频的操作,同时通过提取这2s视频的第一帧实现每隔固定时长提取视频中的一帧图片
  • 提取从视频的00:00:00开始,每隔一定时间(单位:秒)提取图片,为了防止时间累加后导致读取图片为NULL增加了opencv中读取视频时长的操作,以防溢出

5.知识学习与软件应用

  • postman软件
  • 利用socket实现http通信
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 12:34:57  更:2022-10-31 12:35:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 13:10:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码