当前位置: 首页 > news >正文

ffmpeg 子进程从内存读取文件、提取图片到内存

除了网络、文件io,由python或java或go或c等语言开启的ffmpeg子进程还支持pipe,可以从stdin读入数据,输出转化后的图像到stdout。无需编译 ffmpeg,直接调用 ffmpeg.exe不香么!

“从内存读”可用于边下载边转码,节省硬盘寿命。

“提取到内存”可用于服务端生成缩小的预览图,然后发给客户端,传输较快。

从内存读数据流 注意事项

对格式有要求,不能是需要随机读取的文件,比如不能是 MP4,可以是 flv。

参考资料 1:go - ffmpeg via pipe: stream 1, offset 0x30: partial file - Stack Overflow

参考资料 2:command line - FFmpeg “Pipe:0: Invalid data found when processing input” TGA files - Super User

ffmpeg_subprocess.py 代码示例

import subprocessprint(123)# Assuming you have the buffer stored in a variable called 'buffer'ffmpegexe = r'ffmpeg.exe'# Invoke FFmpeg and pass the buffer as input using the 'pipe' protocol
process = subprocess.Popen([ffmpegexe# , "-loglevel", "quiet"# , '-f', 'ts', '-f', 'flv', '-i', 'pipe:0', '-c', 'copy', '-y', 'E:\\test_output.flv'], stdin=subprocess.PIPE)path = 'E:\\test.flv'
length = 0
# Read from the file 'path' in a while loop, 1024 bytes per loop, and write the buffer to process.stdin
with open(path, 'rb') as file:while True:buffer = file.read(1024)if not buffer:breaksize = len(buffer)print('read::', size)length += sizeprocess.stdin.write(buffer)process.stdin.flush()print('readed all::', length)# Close the stdin to indicate the end of input
process.stdin.close()# Wait for the FFmpeg process to finish
process.wait()

结果是,while一边读取flv视频流,ffmpeg一边转换。

输出图像至内存

比如:用于为视频生成缩略图,不用产生临时文件,比较干净:

\生成(视频、图片)缩略图的办法

别老抱着es不放了,视频、图片缩略图可以都用 ffmpeg 生成,有多种办法实现,可移植到windows平台。

方法一、将 lib_ffmpeg 集成到客户端,从网络生成缩略图

这种方法需要编译支持ftp协议的 ffmpeg,然后自行适配各个平台,需要解决各种问题,开发效率低下,而且一旦处理不好,会导致jni崩溃。

结果是传输慢、消耗流量多。

方法二、魔改ftp服务端,调用 ffmpeg.exe 生成缩略图,直接返回图片

无需编译 ffmpeg,直接调用 ffmpeg.exe。

由服务端生成缩小的预览图,然后发给ftp客户端,传输较快。

而且得益于 ffmpeg 丰富的命令配置,可以自定义缩小的尺寸(-vf scale=100:100)、无需生成临时文件(PIPE)等等。

ftp服务端 客户端 我用的都是 appache ftpserver,并加以扩展。

新增 服务端缩略图生成能力

新增 支持目录链接(lnk)可用一个账号管理全部磁盘


高维文件管理器

http://www.lryc.cn/news/136174.html

相关文章:

  • Springboot+Netty+WebSocket搭建简单的消息通知
  • @RefreshScope静态变量注入
  • 多维时序 | MATLAB实现SABO-CNN-GRU-Attention多变量时间序列预测
  • SAP 凭证项目文本 增强 demo2
  • 一套基于C#语言开发的LIMS实验室信息管理系统源码
  • kubesphere部署rocketmq5.x,并对外暴露端口
  • 5.8 汇编语言:汇编高效除法运算
  • 如何通过python来给手机发送一条短信?
  • 无涯教程-PHP - IntlChar类
  • 【Linux操作系统】Linux系统编程中信号捕捉的实现
  • 【PHP】基础语法变量常量
  • Failed to resolve: com.github.mcxtzhang:SwipeDelMenuLayout:V1.3.0
  • 常用 Python IDE 汇总(非常详细)从零基础入门到精通,看完这一篇就够了
  • 【Hive】HQL Map 『CRUD | 相关函数』
  • ELF修复基本工作原理
  • matlab实现输出的几种方式(disp函数、fprintf函数、print函数)
  • C/C++数据库编程
  • 通过python在unity里调用C#接口
  • C++笔记之左值与右值、右值引用
  • JS逆向-某招聘平台token
  • LLMs高效的多 GPU 计算策略Efficient multi-GPU compute strategies
  • jvm-类加载子系统
  • 【实例分割】(一)Mask R-CNN详细介绍带python代码
  • 面试官问我Redis怎么测,我一脸懵逼!
  • 【Spring Boot】四种核心类的依赖关系:实体类、数据处理类、业务处理类、控制器类
  • opencv 进阶15-检测DoG特征并提取SIFT描述符cv2.SIFT_create()
  • ES5 的构造函数和 ES6 的类有什么区别
  • AUTOSAR配置与实践(配置篇) 如何条件控制PDU外发
  • 2023年湖北中级工程师职称申报专业有哪些?甘建二告诉你
  • 记录:ubuntu20.04+ORB_SLAM2_with_pointcloud_map+ROS noetic