0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ESP8266WIFI模块用途开发实例 连网播放视频

码农爱学习 来源:码农爱学习 作者:码农爱学习 2022-06-06 09:34 次阅读

本篇介绍ESP8266OLED上播放视频

电脑Python程序作为视频数据的服务器,借助OpenCV实时读取视频帧,并进行二值图像转换,尺寸调整,再将二值图像转为数组,并以二进制形式的数据通过socket方式无线发送给ESP8266。

ESP8266采用Arduino IDE编程,借助U8g2库,将图像数据实时显示到OLED屏幕中。

pYYBAGKczkKAMkoRAAN3juuVx6M729.png

1 ESP8266端视频帧接收与播放程序

ESP8266作为socket客户端,接收服务端发送的图像帧数据,进行显示。

ESP8266使用Arduino IDE环境进行开发。

1.1 WIFI初始化与服务器连接

#define IP "192.168.5.100"
#define PORT 8080

void initWiFi()
{
  Serial.print("Connecting WiFi...");
  WiFi.mode(WIFI_STA); //配置WIFI为Station模式
  WiFi.begin(ssid, pass); //传入WIFI热点的ssid和密码
  while (WiFi.status() != WL_CONNECTED) //等待连接成功
  {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP()); //打印自己的IP地址

  client.connect(IP, PORT);
}

1.2 视频显示主循环

uint8_t testb[1024] = {};

void loop()
{
  //Serial.println("hello esp8266");
  delay(10);
  while (client.available())
  {
    delay(12);
    client.read(testb, 1024);
    u8g2.firstPage();
    do {
      u8g2.drawXBM(0, 0, 128, 64, testb);
    } while (u8g2.nextPage());
  }
}

2电脑端视频编码发送程序

电脑端作为socket服务器端,将视频帧数据发送出去。

电脑端采用Python3编程,借助OpenCV实现视频的读取与图像数据格式转换。

pYYBAGKczleAfJi5AAExs68QNq8808.png

2.1 主程序

程序的基本思想是:

利用OpenCV读取视频文件

对视频帧的图像,进行尺寸修改

对图像进行二值化处理

将二值图像转换为数组

将数组通过socket发送出去

video_path="badapple_320240_xvid.mp4"
    
def PlayVideo(video_path, client):
    endian          = 'L'
    color_reverse   = 'false'
    
    c = 0#累计帧数
    timeF = 8#隔x帧截一次图
    
    video = cv2.VideoCapture(video_path) #打开视频
    player = MediaPlayer(video_path) #打开音频
    while True:
        grabbed, frame= video.read()
        audio_frame, val = player.get_frame()
        if not grabbed:
            print("End of video")
            break
        if cv2.waitKey(28) & 0xFF == ord("q"):
            break
        cv2.imshow("Video", frame)
        if val != 'eof' and audio_frame is not None:
            img, t = audio_frame

        if (c % timeF == 0):  # 每隔timeF帧进行存储操作
            frame = cv2.resize(frame,(128,64))#调整尺寸
            frame = binary_image(frame)#二值化
            matrix = img_to_matrix(frame, endian, color_reverse)
            data = bytes(matrix)
            client.send(data)

        c = c + 1
        #time.sleep(0.2)
        #cv2.waitKey(1)
            
    video.release()
    cv2.destroyAllWindows()

###############
client = 0
client = socket_start()
PlayVideo(video_path, client)

2.2 图像转为数组

利用OpenCV,将图像转为黑白图像:

def binary_image(image):#将图像处理为二值化的程序
    gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)  #把输入图像灰度化
    h, w =gray.shape[:2]
    m = np.reshape(gray, [1,w*h])
    mean = m.sum()/(w*h)
    ret, binary =  cv2.threshold(gray, mean, 255, cv2.THRESH_OTSU)
    return binary

然后再转为数组:

def img_to_matrix(frame, endian, color_reverse):
    width = frame.shape[1] #128
    height = frame.shape[0] #64

    if endian == 'B':
        byte_reverse = True
    else:
        byte_reverse = False

    if color_reverse == 'true':
        color_reverse = True
    else:
        color_reverse = False

    unalign = 0
    matrix = list()
    
    if (width%8) != 0:
        unalign = 1
    for i in range(0, height): #64
        for j in range(0, (width//8)+unalign): #128/8=16
            v = 0x00
            rs = 8*j      
            re = 8*(j+1)  
            if re > width:
                re = width
            for k in range(rs, re):
                if frame[i, k] != 0:
                    if not byte_reverse:
                        v |= (0x01 << (k%8))
                    else:
                        v |= (0x01 << (7-(k%8)))
            if color_reverse:
                v ^= 0xff
            matrix.append(v)

    return matrix

2.3 开启socket服务

def socket_start():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = socket.gethostbyname(socket.gethostname())
    port = 8080

    host = '192.168.5.100'
    print(host)
    print(port)
    s.bind((host,port))
    s.listen(5)

    print('等待客户端连接中…')

    client,client_address = s.accept()
    print('新连接')
    client_IP = str(client_address[0])
    print('IP:'+client_IP)
    client_port = str(client_address[1])
    print('Port:' + client_port)

    return client

3 测试效果

https://www.bilibili.com/video/BV11S4y1S7ir

pYYBAGKczkKAMkoRAAN3juuVx6M729.png

4 总结

本篇介绍ESP8266在OLED上播放视频,包括ESP8266端的图像接收与显示程序,与电脑端的Python读取视频并进行编码与数据发送程序。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5082

    文章

    19111

    浏览量

    304847
  • WIFI
    +关注

    关注

    81

    文章

    5297

    浏览量

    203595
  • ESP8266
    +关注

    关注

    50

    文章

    962

    浏览量

    44967
收藏 人收藏

    评论

    相关推荐

    ESP8266WiFi模块

    请问,ESP8266WiFi模块设置成AP模式,用USB转串口烧录进去的时候能够搜到WiFi信号,断电后重新上电就搜不到信号了,求各路大神指导
    发表于 07-27 11:22

    esp8266wifi模块工作原理

    esp8266wifi模块工作原理,买正点原子的开发板时送了一块ESP8266wifi模块,一直没使用,最近几天刚好有时间就拿出来玩了一下,
    发表于 07-14 06:39

    ESP8266WiFi模块的学习与使用

    基于STM32的ESP8266wifi模块控制多路继电器ESP8266WiFi模块的学习与使用XCOM V2.0串口调试助手下载链接网络调试助手下载链接
    发表于 08-03 07:20

    esp8266WiFi模块使用经验分享

    esp8266WiFi模块的引脚是怎样进行连接的?如何对esp8266WiFi模块进行调试呢?
    发表于 10-22 09:16

    esp8266过程文档

    通过串口发AT指令驱动esp8266wifi模块,过程
    发表于 11-10 17:09 0次下载

    ESP8266_wifi模块说明书

    ESP8266_WiFi Specifications _ChineseESP8266 wifi模块说明书,中文版
    发表于 12-29 14:16 195次下载

    esp8266串口wifi实例

    ESP8266串口WiFi扩展板是深圳四博智联科技有限公司开发的一款基于乐鑫ESP8266的超低功耗的UART-WiFi
    发表于 12-08 13:34 1.9w次阅读

    esp8266固件如何升级_ESP8266WIFI模块固件升级

    时下很流行的无线通信各式各样,下面小编为大家接收一种最常用的无线通信模块WIFI模块ESP8266 的固件升级。
    的头像 发表于 04-12 10:57 4.3w次阅读
    <b class='flag-5'>esp8266</b>固件如何升级_<b class='flag-5'>ESP8266WIFI</b><b class='flag-5'>模块</b>固件升级

    如何将ESP8266接到WiFi

    在之前的ESP8266项目中,我简要介绍了ESP8266 WiFi模块,如何开始使用ESP8266和Arduino,
    的头像 发表于 07-29 11:32 8.7w次阅读
    如何将<b class='flag-5'>ESP8266</b><b class='flag-5'>连</b>接到<b class='flag-5'>WiFi</b>

    如何设计和开发PCBESP8266WiFi模块

    在本项目/教程中,我将向您展示如何设计和开发PCB ESP8266 WiFi模块。如果你还记得“开始使用ESP8266和ARDUINO ”项
    的头像 发表于 07-29 10:46 1w次阅读

    普中WIFI ESP8266模块的详细资料合集免费下载

    工具包,串口调试助手,手机APP软件,网络调试助手)ESP8266服务器及客户端使用,PZ-WIFI-ESP8266模块开发手册--普中STM32F1
    发表于 03-03 08:00 108次下载
    普中<b class='flag-5'>WIFI</b> <b class='flag-5'>ESP8266</b><b class='flag-5'>模块</b>的详细资料合集免费下载

    ESP8266 WiFi模块获取网络天气适配战舰开发板的使用实例

    本文档的主要内容详细介绍的是ESP8266 WiFi模块获取网络天气适配战舰开发板的使用实例
    发表于 06-12 16:36 39次下载
    <b class='flag-5'>ESP8266</b> <b class='flag-5'>WiFi</b><b class='flag-5'>模块</b>获取网络天气适配战舰<b class='flag-5'>开发</b>板的使用<b class='flag-5'>实例</b>

    ESP8266 wifi模块开发汇总

                                  ESP8266 wifi模块开发汇总 ESP8266
    发表于 11-05 19:21 188次下载
    <b class='flag-5'>ESP8266</b> <b class='flag-5'>wifi</b><b class='flag-5'>模块</b><b class='flag-5'>开发</b>汇总

    ESP8266 WIFI的stm32f103的完整工程

    ESP8266WIFI 的stm32f103 的完整工程资料分享
    发表于 11-17 15:23 29次下载

    esp8266wifi模块怎么连接手机

    ESP8266 WiFi模块连接手机主要可以通过两种方式实现: 通过路由器连接(STA模式)和直接作为热点连接(AP模式) 。以下是两种连接方式的步骤: 一、通过路由器连接(STA模式) 配置
    的头像 发表于 08-19 17:27 2678次阅读