归档

GY-MCU90640 python UART 树莓派 范例

import serial, time
import datetime as dt
import numpy as np
import cv2

# function to get Emissivity from MCU
def get_emissivity():
    ser.write(serial.to_bytes([0xA5,0x55,0x01,0xFB]))
    read = ser.read(4)
    return read[2]/100

# function to get temperatures from MCU (Celsius degrees x 100)
def get_temp_array(d):

    # getting ambient temperature
    T_a = (int(d[1540]) + int(d[1541])*256)/100

    # getting raw array of pixels temperature
    raw_data = d[4:1540]
    T_array = np.frombuffer(raw_data, dtype=np.int16)

    return T_a, T_array

# function to convert temperatures to pixels on image
def td_to_image(f):
    norm = np.uint8((f/100 - Tmin)*255/(Tmax-Tmin))
    norm.shape = (24,32)
    return norm

########################### Main cycle #################################
# Color map range
Tmax = 40
Tmin = 20

print ('Configuring Serial port')
ser = serial.Serial ('/dev/serial0')
ser.baudrate = 115200

# set frequency of module to 4 Hz
ser.write(serial.to_bytes([0xA5,0x25,0x01,0xCB]))
time.sleep(0.1)

# Starting automatic data colection
ser.write(serial.to_bytes([0xA5,0x35,0x02,0xDC]))
t0 = time.time()

try:
    while True:
        # waiting for data frame
        data = ser.read(1544)

        # The data is ready, let's handle it!
        Ta, temp_array = get_temp_array(data)
        ta_img = td_to_image(temp_array)

        # Image processing
        img = cv2.applyColorMap(ta_img, cv2.COLORMAP_JET)
        img = cv2.resize(img, (320,240), interpolation = cv2.INTER_CUBIC)
        img = cv2.flip(img, 1)

        text = 'Tmin = {:+.1f} Tmax = {:+.1f} FPS = {:.2f}'.format(temp_array.min()/100, temp_array.max()/100, 1/(time.time() - t0))
        cv2.putText(img, text, (5, 15), cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 0), 1)
        cv2.imshow('Output', img)

        # if 's' is pressed - saving of picture
        key = cv2.waitKey(1) & 0xFF
        if key == ord("s"):
            fname = 'pic_' + dt.datetime.now().strftime('%Y-%m-%d_%H-%M-%S') + '.jpg'
            cv2.imwrite(fname, img)
            print('Saving image ', fname)

        t0 = time.time()

except KeyboardInterrupt:
    # to terminate the cycle
    ser.write(serial.to_bytes([0xA5,0x35,0x01,0xDB]))
    ser.close()
    cv2.destroyAllWindows()
    print(' Stopped')

# just in case 
ser.close()
cv2.destroyAllWindows()

转自:https://github.com/vvkuryshev/GY-MCU90640-RPI-Python

AIR10X 合宙屏幕配合ESP32C3

RT
合宙家的屏幕配上合宙家的esp32C3

插上后
上下左右按钮对应的GPIO为

屏幕 摇杆
放置

遥杆

遥杆按钮 ESP32C3
8
13
5
9
按下 4
from machine import Pin
a=Pin(8,Pin.IN,Pin.PULL_UP)
print(a.value())

屏幕

ST7735

m3u8 广告h.264

请务必使用H。264编码 ,两个文件都得使用h.264 使用fmp4 无法跳转

使用标签
#EXT-X-DISCONTINUITY

若使用嵌入图片实时替换则对一个TS文件转码,切记为h.264

添加水印:

ffmpeg -i d20.ts -vf "movie=a.jpeg[watermark];[in][watermark] overlay=main_w-overlay_w-10:main_h-overlay_h-10[out] " -c:v libx264 d30.ts
切记编码格式不能用copy 必须手动制定
建议将切片设置为10秒 则插入广告 时间较多

图片在视频的位置为左下角
main_w-overlay_w-10 : 水印在x轴的位置,也可以写成x=main_w-overlay_w-10

main_h-overlay_h-10:水印在y轴的位置

ffmpeg -i d20.ts -c:v libx264  -vf "drawtext=text=首家线上堵车疏通平台上线了 :expansion=normal:fontfile=simkai.ttf: y=h-line_h-10:x=(mod(5*n\,w+tw)-tw): fontcolor=white: fontsize=40: shadowx=2: shadowy=2" d30.ts

下面 从左向右文字显示 白色 字体大小 40 字体simkai.tff文件请拷贝到执行目录

:y=h-line_h-10:x=w-(t-4.5)*w/5.5:从右向左
: y=h-line_h-10:x=(mod(5*n\,w+tw)-tw):从左向右

hevc 的hev1与hvc1

265即 HEVC,在打包成mp4时需要有 codec tag。hev1 or hvc1是两种codec tag,表示mp4容器中hevc流的不同打包方式。Quicktime Player和iOS不支持hev1
默认是hev1,需要使用ffmpeg修改

ffmpeg -i input-hev1.mp4 -c:v libx265 -tag:v hvc1 -c:a copy output-hvc1.mp4

#h.265 fmp4
 ffmpeg -i d1.mp4 -c copy -hls_time 4 -f hls -hls_playlist_type vod  -hls_segment_type fmp4  d.m3u8

#h.264 TS
ffmpeg -i 12.mp4 -vcodec copy -acodec copy -f hls -hls_time 3 -hls_list_size 0 -y m3u8

ffmpeg 技术 HLS 手札

H.264 CRF 默认23
H.265 CRF 默认28

选项 参数 解释
-hls_time 数字 每隔一段时间切片
-hls_list_size 数字 0 则为不限制播放列表长度
-hls_segment_type fmp4 片段类型名 h.265值fmp4 使用fmp4时m3u8会出现一个#EXT-X-MAP:URI=”init.mp4″
-i 文件名 输入文件名
-f 输出类型 hls 输出类型
-hls_playlist_type 值vod 设置hls播放类型为点播放,该选项回将hls_list_size 设置为0
-crf 数值 压缩值 0为无损,23最好 ,30以上不建议选择
-c:a aac 设置音频编码aac 复制为copy参数
-c:v libx264 设置视频编码为h.264 复制为copy参数
-c:v libx265 设置视频编码为h.265
-hls_flags independent_segments 当确保播放列表中所有切片都以一个关键帧开始时,将#EXT-X-INDEPENDENT-SEGMENTS添加到播放列表中。
-hls_flags delete_segments 用于直播 自动删除旧的ts,只保留最新的几个
-hls_flags append_list 广告添加/HLS拼接 告诉 ffmpeg 添加到最后,而不是替换原文件。
-hls_flags split_by_time 告诉 ffmpeg 将切片时长尽量保证一至。(因为关键帧的存在) 可以使用+ 联合使用
-hls_segment_filename ac%6d.ts 用于在打包过程中为所创建的视频切片命名ac00000.ts ac00001.ts
-s 1920×1080 设置分辨率1920×1080
-r 30 设置fps为30 默认25
-b:a 128k 设置音频码率128k 与同类的copy不可以用
-b:v 2500k 设置视频码率平均2500k 与同类的copy不可以用
-maxrate 2675k 设置最大码率2675k
-maxrate 3000k 设置 bufsize 是为了让码率分布更均匀,设置的越小检查的频率越高,画质越差。一般设置 maxrate 的一到两倍之间
-ar 44100 音频采样频率 44100
-ac 2 音频通道数,2通道
-threads 0 自动根据计算机核心启用多线程
-g 60 关键帧最大间隔数 若30fps 2秒一切 则建议为60
-keyint_min 60 关键帧的最小间隔数正好关键帧的最小和最大间隔数
-sc_threshold 0 转换场景时不自动生成关键帧
-max_muxing_queue_size 1024 增大容器封装队列大小,用于处理 转码报错 Too many packets buffered for output stream 0:1.
-vf “scale=1280:-2” 转码视频保持1280的宽度,防止出现不被2整除的高度
-hls_key_info_file enc.keyinfo enc.keyinfo为key文件
hls_fmp4_init_filename init.mp4 设置fmp4下头文件 默认init.mp4