node文件資源管理器讀取視頻信息從零實(shí)現(xiàn)
前置準(zhǔn)備
需要 ffmpeg 與配套的 ffprobe
- ffprobe 用于獲取視頻的媒體信息。視頻流,音頻流,字幕等信息
- ffmpeg 用于獲取視頻播放更多信息。對(duì)視頻某個(gè)時(shí)間段進(jìn)行截圖等操作
需要開(kāi)發(fā)機(jī)安裝 ffmpeg 或 docker 容器內(nèi)安裝 ffmpeg 開(kāi)發(fā)。全環(huán)境的 ffmpeg 較大,對(duì)最終生成的 docker 鏡像的大小影響較大。
dockerfiel 添加一條安裝 ffmpeg 的方法
RUN apk add --no-cache ffmpeg
開(kāi)發(fā)
這次主要使用 ffprobe 獲取視頻的媒體信息。
安裝依賴(lài)
explorer-manage
pnpm i ffprobe pnpm i @types/ffprobe -D
ffprobe 依賴(lài)主要用于將 ffprobe 命令輸出的信息進(jìn)行格式化成 node 可以直接消費(fèi)的結(jié)構(gòu)。
explorer-manage 創(chuàng)建一個(gè)文件 src/ffmpeg/main.mjs,內(nèi)容如下
import ff_probe from 'ffprobe' import { formatPath, resetPath } from '../../lib/format-path.mjs' // npm install ffprobe-static // import ff_probe_static from 'ffprobe-static' export const getVideoInfo = (path = '') => { return ff_probe(formatPath(path), { path: 'ffprobe', }).catch((err) => { console.log({ err }) }) }
其中可以使用 npm install ffprobe-static 安裝 ffprobe 的靜態(tài)文件,供 ffprobe 依賴(lài)提供的 path: ff\_probe\_static.path 方法注入路徑。由于開(kāi)發(fā)機(jī)上已安裝 ffmpeg,所以這里僅供參考。
explorer 客戶(hù)端
客戶(hù)端依舊使用 Next.js 的 server action 調(diào)用 getVideoInfo 方法實(shí)現(xiàn)。
常規(guī)套路
- 使用上下文控制側(cè)邊抽屜彈窗顯示
- 側(cè)邊抽屜彈窗內(nèi)的視頻流、音頻流、字幕等信息使用 Tab 組件區(qū)分
server action
'use server' import { getVideoInfo } from '@/explorer-manager/src/ffmpeg/main.mjs' export const getVideoInfoAction: typeof getVideoInfo = (path) => { return getVideoInfo(path) }
這里偷懶了,直接使用 typeof getVideoInfo 給 getVideoInfoAction 進(jìn)行狀態(tài)聲明。
modal
'use client' import React from 'react' import { Card, Descriptions, Drawer, Space, Tabs } from 'antd' import { map, isEmpty, isObject } from 'lodash' import { useRequest } from 'ahooks' import { VideoInfoContext } from '@/components/video-info-modal/video-info-context' import { getVideoInfoAction } from '@/components/video-info-modal/action' const VideoInfoItem: React.FC = () => { const video_path = VideoInfoContext.useStore() const { data, loading, run } = useRequest(() => getVideoInfoAction(video_path)) return ( <Card loading={loading}> <Tabs items={data?.streams.map((item) => { return { key: [item.codec_type, item.index].join('-'), label: ( <Space> {item.codec_type} {item.index > 0 ? item.index : ''} </Space> ), children: ( <> <Descriptions column={1} labelStyle={{ width: '15em', textAlign: 'right' }} style={{ maxHeight: '85vh', overflow: 'scroll', overscrollBehavior: 'contain' }} > {map(item, (value, key) => ( <Descriptions.Item key={key} label={key}> {isObject(value) ? <pre>{JSON.stringify(value, null, 2)}</pre> : value?.toString()} </Descriptions.Item> ))} </Descriptions> </> ), } })} /> </Card> ) } const VideoInfoModal: React.FC = () => { const video_path = VideoInfoContext.useStore() const dispatch = VideoInfoContext.useDispatch() return ( <Drawer title="視頻信息" placement="right" open={!isEmpty(video_path)} width={1000} onClose={() => dispatch('')} footer={false} destroyOnClose={true} > <VideoInfoItem /> </Drawer> ) } export default VideoInfoModal
- 使用 ahooks 的 useRequest 封裝 server action 方法。內(nèi)置 loading、 data 等狀態(tài)。
- 當(dāng)組件首次被裝載時(shí),useRequest 調(diào)用 getVideoInfoAction 獲取數(shù)據(jù)
- 內(nèi)部使用 Antd 提供的 Card 組件用于 loading 狀態(tài)。 Tab 對(duì)數(shù)據(jù)的視頻、音頻等信息進(jìn)行區(qū)分顯示。
效果
git-repo
以上就是node文件資源管理器讀取視頻信息從零實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于node文件資源讀取視頻的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
簡(jiǎn)述pm2常用命令集合及配置文件說(shuō)明
這篇文章主要介紹了簡(jiǎn)述pm2常用命令集合及配置文件說(shuō)明,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Node.js發(fā)起HTTP請(qǐng)求的6種不同方法小結(jié)
本文主要介紹了Node.js發(fā)起HTTP請(qǐng)求的6種不同方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03node.js [superAgent] 請(qǐng)求使用示例
這篇文章主要介紹了node.js [superAgent] 請(qǐng)求使用示例,分別給大家匯總了post請(qǐng)求、get請(qǐng)求、delete請(qǐng)求和put請(qǐng)求的示例,推薦給大家,希望大家能夠喜歡。2015-03-03淺談Node.js ORM框架Sequlize之表間關(guān)系
下面小編就為大家?guī)?lái)一篇淺談Node.js ORM框架Sequlize之表間關(guān)系。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07Node如何后臺(tái)數(shù)據(jù)庫(kù)使用增刪改查功能
這篇文章主要介紹了Node如何后臺(tái)數(shù)據(jù)庫(kù)使用增刪改查功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11Nodejs 微信小程序消息推送的實(shí)現(xiàn)
這篇文章主要介紹了Nodejs 微信小程序消息推送的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01node鏈接mongodb數(shù)據(jù)庫(kù)的方法詳解【阿里云服務(wù)器環(huán)境ubuntu】
這篇文章主要介紹了node鏈接mongodb數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式分析了nodejs基于阿里云服務(wù)器環(huán)境ubuntu下實(shí)現(xiàn)連接MongoDB數(shù)據(jù)庫(kù)的相關(guān)操作技巧,需要的朋友可以參考下2019-03-03