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.mzph.cn/news/47670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用lodash的throttle函数会触发两次

当使用lodash的throttle函数时会触发两次,分别在最开始和最后。 严格来说不算是bug,因为官方文档写的很清楚。throttle函数其实有三个参数: _.throttle(func, [wait0], [options]) func: 要节流的函数 wait: 等待时间 options: 选项 op…

【Java面试题】线程创建的三种方式及区别?

三种线程创建方式 继承Thread类,子类重写run()方法,调用子类的strat()启动线程。实现Runnable接口,实现run()方法,调用对象start()启…

【回味“经典”】DFS基础训练(N皇后,装载问题)

这篇文章是一年前写的 走进“深度搜索基础训练“,踏入c算法殿堂(一)和 走进“深度搜索基础训练“,踏入c算法殿堂(二)的重编版。 希望以此,唤起对那位故人的回忆。 小航走入赛场,比赛…

常见的网络设备有哪些?分别有什么作用?

个人主页:insist--个人主页​​​​​​ 本文专栏:网络基础——带你走进网络世界 本专栏会持续更新网络基础知识,希望大家多多支持,让我们一起探索这个神奇而广阔的网络世界。 目录 一、网络设备的概述 二、常见的网络设备 1、…

eslintignore无效解决办法

项目的根目录下新建.eslintignore,但是无论怎么配置,该文件总是无法生效。本想解决不生效的问题,但是一直无法解决,于是换了一种解决问题的思路。 方法一: 在需要进行忽略的文件顶部加上 /* eslint-disable */这样e…

JVS低代码中表单引擎与逻辑引擎是如何联合调用外部API的?

在企业项目中,常常出现需要给外部系统提供一个api ,让外部系统触发调用,本系统直接数据入库,那么我们来看看jvs的表单引擎与逻辑引擎联合实现这个功能,先看实现效果: 配置步骤: 一、配置列表页…

【机密计算实践】支持 Intel SGX 的 LibOS 项目介绍(一)

一、LibOS 库操作系统(Library Operating System,简称 LibOS)是根据某类应用的特殊需求,由某一高级编程语言将原本属于操作系统内核的某些资源管理功能,如文件磁盘 I/O、网络通信等,按照模块化的要求,以库的形式提供给应用程序的特殊操作系统。 它能代替操作系统内核合…

springboot(JavaCV )实现视频截取第N帧并保存图片

springboot(JavaCV )实现视频截取第N帧并保存图片 现在视频网站展示列表都是用img标签展示的,动图用的是gif,但是我们上传视频时并没有视屏封面,就这需要上传到服务器时自动生成封面并保存 本博客使用jar包的方式实现…

如何成功开展跨境电子商务?快速入门!

随着全球化的推进和互联网技术的发展,跨境电子商务已经成为许多企业追求新市场和实现增长的重要途径。然而,要在这个竞争激烈的领域中脱颖而出并取得成功并非易事。本文将介绍三个可行的策略,以帮助企业成功开展跨境电子商务。 第一策略&…

浙大数据结构第八周之08-图8 How Long Does It Take

前置知识: 拓扑排序: /* 邻接表存储 - 拓扑排序算法 */bool TopSort( LGraph Graph, Vertex TopOrder[] ) { /* 对Graph进行拓扑排序, TopOrder[]顺序存储排序后的顶点下标 */int Indegree[MaxVertexNum], cnt;Vertex V;PtrToAdjVNode W;Queue Q Cre…

网络面试题(172.22.141.231/26,该IP位于哪个网段? 该网段拥有多少可用IP地址?广播地址是多少?)

此题面试中常被问到,一定要会172.22.141.231/26,该IP位于哪个网段? 该网段拥有多少可用IP地址?广播地址是多少? 解题思路: 网络地址:172.22.141.192 10101100.00010110.10001101.11000000 广播…

【后端速成 Vue】第一个 Vue 程序

1、为什么要学习 Vue? 为什么使用 Vue? 回想之前,前后端交互的时候,前端收到后端响应的数据,接着将数据渲染到页面上,之前使用的是 JavaScript 或者 基于 JavaScript 的 Jquery,但是这两个用起来还是不太…

uni-app 打包生成签名Sha1

Android平台打包发布apk应用,需要使用数字证书(.keystore文件)进行签名,用于表明开发者身份。 可以使用JRE环境中的keytool命令生成。以下是windows平台生成证书的方法: 安装JRE环境(推荐使用JRE8环境&am…

yolov8模型转onnx模型 和 tensorRT 模型

转onnx模型 在 安装好 pip install onnxruntime-gpu pip install onnx onnxconverter-common 出现 No module named cpuinfo 错误,通过安装: pip install py-cpuinfo 解决该问题。 import sys # 即 ultralytics文件夹 所在绝对路径 sys.path.app…

STM32 GPIO复习

GPIO General Purpose Input Output,即通用输入输出端口,简称GPIO。 负责采集外部器件的信息或控制外部器件工作,即输入输出。 不同型号,IO口数量可能不一样,可通过选型手册快速查询。 能快速翻转,每次翻…

Crimson:高性能,高扩展的新一代 Ceph OSD

背景 随着物理硬件的不断发展,存储软件所使用的硬件的情况也一直在不断变化。 一方面,内存和 IO 技术一直在快速发展,硬件的性能在极速增加。在最初设计 Ceph 的时候,通常情况下,Ceph 都是被部署到机械硬盘上&#x…

vellum (Discovering Houdini VellumⅡ柔体系统)学习笔记

视频地址: https://www.bilibili.com/video/BV1ve411u7nE?p3&spm_id_frompageDriver&vd_source044ee2998086c02fedb124921a28c963(搬运) 个人笔记如有错误欢迎指正;希望可以节省你的学习时间 ~享受艺术 干杯&#x1f37b…

Vue——如何在安卓项目中加载离线vue项目

最近在做一个离线工单的功能,为了直接复用原来在线H5的代码,我希望将它放到安卓本地来加载,做法比较简单,无非就是npm run build打包,然后把包放到安卓项目的assets目录下,然后按照正常加载webview的方式加…

jira增删改查接口

安装 pip install atlassian-python-api3.40.1 若安装失败,可尝试加上清华源(-i https://pypi.tuna.tsinghua.edu.cn/simple) 使用 为了防止信息泄露,可将账号密码单独存放到json文件中 ,如credential.json {"name" : "xiaoming"…