关于使用ffmpeg的一些使用方法

ffmpeg应用接口服务

一、服务介绍

基于ffmpeg和fastApi实现以下功能:

rtsp/rtmp视频流转码,目前仅用于web点播flv格式。

视频录制,生成flv文件

视频截图,生成jpg图片

srs介绍

流媒体服务器。支持将接入的RTMP流进行各种变换,譬如将RTMP流转码、 转封装成HTTP-FLV流、转封装成HLS。

此次应用主要涉及到srs的http-flv流转发。结合ffmpeg 讲视频流推到srs流媒体服务器,再转发出来http-flv格式的流,视频前端flv.js点播。

ffmpeg介绍

ffmpeg命令常用于音视频剪切、转码、滤镜、拼接、混音、截图等。我们这个服务主要用到视频转码和截图两个功能。

-vcodec指定视频编码,

-acodec指定音频编码,

-c = -codec 指定编码器 copy直接复制

-s 指定视频分辨率 640x480,

-b 指定码率 200k,

-r 指定帧率

-y 强制覆盖输出文件

-n 不覆盖输出文件,如果文件已存在直接退出

-i 输入文件的路径

-f 设置文件格式

-t 第几秒开始截取视频数据
rtsp_transport tcp 使用tcp方式 稳定不花屏

max_delay 接收包间隔最大延迟 微秒

-tune zerolatency 零延迟

-an 忽略声音

-preset ultrafast 转码速度设置超快

-vprofile baseline 基本画质

视频转码

bash 复制代码
ffmpeg -i input.mp4 \
      -vcodec libx264\
      -acodec aac \
      -s 640x480 \
      -b 200k \
      -r 20 \
      transcode.mp4

rtsp 转flv示例

bash 复制代码
ffmpeg -rtsp_transport tcp -i rtsp://admin:yisa123456@192.168.7.211 -vcodec libx264 -vprofile baseline -an -tune zerolatency -preset ultrafast   -f flv rtmp://192.168.7.203:31935/flv/1.flv

视频录制

bash 复制代码
ffmpeg  -i rtsp://1.1.1.1 -y -c copy a.flv

视频截图

如果开始拉流不稳定,可以-t 调大一点,等取流稳定后截图,避免截出模糊抖动的图片

bash 复制代码
ffmpeg -i rtsp://1.1.1.1 -y -f mjpeg -t 0.5 ./a.jpg

利用opencv读取rtsp的实时帧

直接使用opencv的cv2.VideoCapture直接读取rtsp视频流,这样做的缺点是延迟严重、出现掉帧、花屏现象等,原因在于opencv自己有一个缓存,每次会顺序从自己的缓存中读取,而不是直接读取最新帧,代码如下:

bash 复制代码
读取视频帧
def readFrame(self):
   print("取帧分析:{}".format(self.source_url))
   cap = cv2.VideoCapture(self.source_url)
   while cap.isOpened():
       # ap.read() 返回一个布尔值(True/False)。如果帧能够正确读取, 就是 True
       # 有时 cap 可能不能成功的初始化摄像头设备。这种情况下上面的代码会报错。可以使用 cap.isOpened(),来检查是否成功初始化
       is_opened, frame = cap.read()
       cv2.imshow("frame",frame)
       if cv2.waitKey(25) & 0xFF == ord('q'):
           break
   cv2.destroyAllWindows()
   # 关闭视频文件
cap.release()

模拟利用多线程处理延迟问题

python 复制代码
def capture_thread(video_path, frame_buffer, lock):
   print("capture_thread start")
   vid = cv2.VideoCapture(video_path)
   print(vid.get(cv2.CAP_PROP_FPS))
   if not vid.isOpened():
       raise IOError("Couldn't open webcam or video")
   while True:
       return_value, frame = vid.read()
       if return_value is not True:
           break
       lock.acquire()
       start_time = time.time()
       print('图像存放时间:', start_time)
       frame_buffer.push([frame, start_time])
       print('存放后列表中有图像的张数:', frame_buffer.size())
       lock.release()
       cv2.waitKey(25)
python 复制代码
处理帧线程
def play_thread(frame_buffer, lock):
   print("detect_thread start")
   print("detect_thread frame_buffer size is", frame_buffer.size())

   while True:
       if frame_buffer.size() >= 1:
           lock.acquire()
           frame_list = frame_buffer.pop()
           frame = frame_list[0]
           end_time = time.time()
           frame_buffer.clear()
           print('图像取出时间:', end_time)
           print('取出后列表中有图像的张数:', frame_buffer.size())
           print('每张图像显示时间:', end_time - frame_list[1])
           lock.release()
           cv2.imshow("result", frame)
           if cv2.waitKey(1) & 0xFF == ord('q'):
               break

二、接口api

2.1 添加转码任务

接口地址
http://1.1.1.1:7777/video/add

请求方式

GET

参数

|------------|----------------|
| 参数名 | 说明 |
| source_url | rtsp/rtmp视频流地址 |
| loc_id | 视频设备编码,唯一标识 |

bash 复制代码
curl http://1.1.1.1:7777/video/add?source_url=rtsp://admin:223323456@192.168.7.212&loc_id=1

返回数据

bash 复制代码
{
   "code": 1,
   "messgae": "任务添加成功",
   "data": "http://1.1.1.1:38090/live/1.flv"
}

2.2 删除转码任务

接口地址

http://1.1.1.1:7777/video/delete

请求方式

GET

|------------|----------------|
| 参数名 | 说明 |
| source_url | rtsp/rtmp视频流地址 |
| loc_id | 视频设备编码,唯一标识 |

bash 复制代码
curl http://1.1.1.1:7777/video/delete?source_url=rtsp://admin:y432411114@192.168.7.212&loc_id=1

返回数据

bash 复制代码
{
   "code": 1,
   "message": "任务删除成功",
   "data": "1" #返回loc_id
}

2.3 截图

接口地址

http://1.1.1.1:7777/image/get

请求方式

GET

|------------|----------------|
| 参数名 | 说明 |
| source_url | rtsp/rtmp视频流地址 |

http://1.1.1.1:7777/image/get?source_url=rtsp://admin:5rew123456@192.168.7.212

返回数据

bash 复制代码
{
   "code": 1,
   "message": "success",
   "data": "http://1.1.1.1:7777/public/20230411065503_c8dffb86d83511ed8be50242ac170002.jpg"
}
相关推荐
proware18 小时前
ffmpeg 初始化配置及基本概念与套路
ffmpeg·mpp·rockchip·rga
程序员老陆21 小时前
FFmpeg的AVFrame全部数据操作函数详解
ffmpeg·音视频·avframe
glumes1 天前
从《牛来》到 DCP:一部电影是怎么走进电影院的?
ffmpeg·音视频开发
程序员老陆2 天前
FFmpeg RTSP 解复用器(rtsp demuxer)完全解析:从「能播」到「稳播」的参数圣经
ffmpeg·音视频·拉流·rtsp
诸葛大钢铁3 天前
视频转音频怎么转换?在线工具、VLC、FFmpeg 三种方法详解
ffmpeg·音视频·mp4转mp3·视频转音频·视频转mp3·视频提取音频
qingmiaozhuan3 天前
电脑录屏软件追剧高光截取:FFmpeg帧裁剪与可视化方案对比
ffmpeg·电脑·音视频开发·录屏技术·电脑录屏
程序员老陆4 天前
FFmpeg6操作 RTMP参数详解
ffmpeg·音视频·rtmp
戒了,最后一次4 天前
Windows 安装 FFmpeg 完整教程(附环境变量配置 + 常用命令示例)
windows·ffmpeg
≮傷£≯√4 天前
FFmpeg + qt 音频播放
qt·ffmpeg·音视频
程序员老陆5 天前
Qt的QThread::usleep和FFmpeg的libavutil模块的av_usleep哪个精度高一些?
开发语言·qt·ffmpeg·音视频