归档

ffmpeg 手札

安装
ffmpeg是一款处理视频的软件,包含常用的转码,截图等功能。

转码部分包含转换成我们常用的mp4格式,m3u8格式,m3u8+key格式。m3u8直播格式等

官网:https://ffmpeg.org/

安装方法很简单,以windows为例,下载ffmpeg放到任意文件夹里即可。需要注意的就是如果需要用到加密key的m3u8,则需要将ffmpeg添加到环境变量中。

比如您将ffmpeg安装在D盘下,添加到环境变量中的路径应该为:D:\ffmpeg\bin,关于怎么添加环境变量,请自行搜索教程

如果不安装到环境变量,则使用时需要点击系统>运行,输入cmd,调出cmd窗口,输入d:(回车),输入 cd ffmpeg(回车),下面就可以执行下面的命令进行转码操作

#ffmpeg的简单使用
一:将input.avi转换成output.mp4:

ffmpeg -i input.avi output.mp4

二:增加一些要求:

ffmpeg -threads 4 -i input.avi -ab 32 -flags +loop -vol 200 -vf yadif input.mp4

-ab:设置比特率

-vol:音量提高到200%

三:转码时修改尺寸:

ffmpeg -i input.avi -s 640×320 input.mp4

四:将视频转成m3u8点播文件

ffmpeg.exe -i input.avi -strict -2 -hls_time 10 -hls_list_size 0 -c:v libx264 -c:a aac -f hls input.m3u8

-hls_time 10:每个ts文件10秒左右。这个会根据具体情况,尽量维系在10秒一个ts

-hls_list_size 0:m3u8索引里保留所有的ts路径

五:将视频转成加密的m3u8点播文件

ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -hls_time 10 -hls_list_size 0 -hls_key_info_file key_info input.m3u8

key_info需要替换成自己的路径,因为需要加密,所以需要准备二个文件一个是:key.key,一个是key_info。详细的不在这里作介绍,如果有兴趣可以看视频实际了解详细使用方法。

六:截图:

ffmpeg -ss 00:02:06 -i input.mp4 -f image2 -y poster.jpg

-ss:截图的时间点

七:连续截图:

ffmpeg -y -i input.mp4 -vf “fps=1/2,scale=iw/4:-1,tile=10×10” -an %d.png

fps=1/2:每2秒截一张图,如果是每秒截一张的话应该是fps=1

scale:所截图片大小,上面的代码是设置宽为原始的1/4大小,高度自动,相当于iw/4:ih/4,也可以设置成固定值如120:80

tile:网格化,自动将100张图合并成一张大图

八:连续截图的另外一个方法

ffmpeg -i my_dream.mp4 -vf fps=1/2 -q:v 2 -s 120×67 preview/%d.png

fps=1/2:每2秒截一张图,如果是每秒截一张的话应该是fps=1

-s:尺寸

这种方式截出来的是小图,需要自己再拼合。

转码:

ffmpeg -i input.mp4 -max_muxing_queue_size 1024 -vcodec libx264 -crf 28 -y -vf \"scale=1280:-2\" -acodec aac -ab 128k output.mp4

转码直接切片:h.264可以

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

h.265
ffmpeg -y -i 12.mp4 -c copy -hls_segment_type fmp4 -hls_time 6 -hls_list_size 10 -hls_flags delete_segments+append_list+split_by_time  -hls_playlist_type vod 1.m3u8

需要再打磨 在ckplayer上可以使用

ESP32CAM的使用 (一)

ESP32CAM的使用

基础入门

import camera

camera.init(0,format=2)
camera.init(0,format=camera.GRAYSCALE) 
#默认灰度图

camera.init(0,format=3)
camera.init(0,format=camera.JPEG)
#JPG格式

# 相关格式
# JPEG -- 3
# YUV422 -- 1
# GRAYSCALE -- 2
# RGB565 -- 0


camera.framesize(5)
#320X240 设置分辨率 

img=camera.capture()



import uos

from machine import SDCard

#FAT 格式的存储卡

uos.mount(SDCard(),'/sd')
uos.listdir()
uos.chdir('/sd')
uos.listdir()


fg=open("a.jpg","w")
fg.write(img)
fg.close() 

#thonny 使用直接右击下载文件,直接查看,本地空间,OPENMV下的esp32cam有1MB的可用空间,单纯micropython下有2MB的空间


#闪关灯

#GPIO4 为LED补光灯,若长时间使用会有严重的发热问题
from machine import Pin
flash=Pin(4,Pin.OUT)
flash.on() #打开闪关灯
flash.off() #关闭闪关灯



openmv初体验

img参数直接打印为: 分辨率 文件类型 文件大小

在非jpg下 建设使用320×240 的分辨率(默认分辨率)
可用分辨率:

需要250ms (推荐分辨率 可以4FPS)
* camera.framesize(5) 5 :::: {“w”:320, “h”:240, “type”=”grayscale”, “size”:76800} ::: 267 ms
* camera.framesize(6) 6 :::: {“w”:400, “h”:296, “type”=”grayscale”, “size”:118400} ::: 249 ms

需要750ms
* camera.framesize(7) 7 :::: {“w”:480, “h”:320, “type”=”grayscale”, “size”:153600} ::: 770 ms
* camera.framesize(8) 8 :::: {“w”:640, “h”:480, “type”=”grayscale”, “size”:307200} ::: 722 ms
* camera.framesize(9) 9 :::: {“w”:800, “h”:600, “type”=”grayscale”, “size”:480000} ::: 686 ms

需要2000ms(不建议使用)
* camera.framesize(10) 10 :::: {“w”:1024, “h”:768, “type”=”grayscale”, “size”:786432} ::: 2019 ms
* camera.framesize(11) 11 :::: {“w”:1280, “h”:720, “type”=”grayscale”, “size”:921600} ::: 1819 ms
* camera.framesize(12) 12 :::: {“w”:1280, “h”:1024, “type”=”grayscale”, “size”:1310720} ::: 2126 ms
* camera.framesize(13) 13 :::: {“w”:1600, “h”:1200, “type”=”grayscale”, “size”:1920000} ::: 1968 ms

JPG模式下全分辨率可用,但是使用OPENMV建议处理分辨率为320×240 或 400×296

ESP32CAM 处理步骤

  1. 设定相机参数
  2. 拍照
  3. 使用OPENMV处理

使用img(拍摄完的对象)进行处理
使用help(img)查看其方法
和openmv的stm32设备下,除了拍照方面不同,其他方面都差不多,文档地址:
book.openmv.cc
大家做相应的替换

二维码识别:

img.find_qrcodes()
若识别到二维码,就会返回扫描的相关数据。
但是二维码需要使用灰度图片

import time,camera
camera.init(0,format=2)
camera.init(0,format=camera.GRAYSCALE) 
while True:
    img=camera.capture()
    e=img.find_qrcodes()
    if e:
        print(e)
    time.sleep(0.5)

micropython Timer 定时器

micropython

from machine import Timer
y=Timer(12)
p=Timer(16)
y.init(period=9000, mode=Timer.ONE_SHOT, callback=lambda t:print(12))
p.init(period=9000, mode=Timer.PERIODIC, callback=lambda t:print(12))

Timer.ONE_SHOT 一次性

PERIODIC 重复

period=9000 时间9000ms

callback= 回调函数

注意:设置回调函数的必须传参数

def xc(a):#注意a的参数
    print(123)

y.init(period=9000, mode=Timer.ONE_SHOT, callback=xc)