前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ESP8266WIFI连网播放视频

ESP8266WIFI连网播放视频

作者头像
xxpcb
发布2022-10-04 13:55:08
4770
发布2022-10-04 13:55:08
举报
文章被收录于专栏:码农爱学习的专栏

本篇介绍ESP8266在OLED上播放视频:

  • 电脑端Python程序作为视频数据的服务器,借助OpenCV实时读取视频帧,并进行二值图像转换,尺寸调整,再将二值图像转为数组,并以二进制形式的数据通过socket方式无线发送给ESP8266。
  • ESP8266采用Arduino IDE编程,借助U8g2库,将图像数据实时显示到OLED屏幕中。

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

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

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

1.1 WIFI初始化与服务器连接

代码语言:javascript
复制
#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 视频显示主循环

代码语言:javascript
复制
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实现视频的读取与图像数据格式转换。

2.1 主程序

程序的基本思想是:

  • 利用OpenCV读取视频文件
  • 对视频帧的图像,进行尺寸修改
  • 对图像进行二值化处理
  • 将二值图像转换为数组
  • 将数组通过socket发送出去
代码语言:javascript
复制
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,将图像转为黑白图像:

代码语言:javascript
复制
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

然后再转为数组:

代码语言:javascript
复制
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服务

代码语言:javascript
复制
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 测试效果

http://mpvideo.qpic.cn/0bc3mmabsaaaouap7euryjrfay6ddfrqagia.f10002.mp4?

4 总结

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农爱学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 ESP8266端视频帧接收与播放程序
    • 1.1 WIFI初始化与服务器连接
      • 1.2 视频显示主循环
      • 2电脑端视频编码发送程序
        • 2.1 主程序
          • 2.2 图像转为数组
            • 2.3 开启socket服务
            • 3 测试效果
            • 4 总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档