node文件資源管理器讀取視頻信息從零實(shí)現(xiàn)
前置準(zhǔn)備
需要 ffmpeg 與配套的 ffprobe
- ffprobe 用于獲取視頻的媒體信息。視頻流,音頻流,字幕等信息
- ffmpeg 用于獲取視頻播放更多信息。對視頻某個(gè)時(shí)間段進(jìn)行截圖等操作
需要開發(fā)機(jī)安裝 ffmpeg 或 docker 容器內(nèi)安裝 ffmpeg 開發(fā)。全環(huán)境的 ffmpeg 較大,對最終生成的 docker 鏡像的大小影響較大。
dockerfiel 添加一條安裝 ffmpeg 的方法
RUN apk add --no-cache ffmpeg
開發(fā)
這次主要使用 ffprobe 獲取視頻的媒體信息。
安裝依賴
explorer-manage
pnpm i ffprobe pnpm i @types/ffprobe -D
ffprobe 依賴主要用于將 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 依賴提供的 path: ff\_probe\_static.path 方法注入路徑。由于開發(fā)機(jī)上已安裝 ffmpeg,所以這里僅供參考。
explorer 客戶端
客戶端依舊使用 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 對數(shù)據(jù)的視頻、音頻等信息進(jìn)行區(qū)分顯示。
效果

git-repo
以上就是node文件資源管理器讀取視頻信息從零實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于node文件資源讀取視頻的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Node.js發(fā)起HTTP請求的6種不同方法小結(jié)
本文主要介紹了Node.js發(fā)起HTTP請求的6種不同方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
淺談Node.js ORM框架Sequlize之表間關(guān)系
下面小編就為大家?guī)硪黄獪\談Node.js ORM框架Sequlize之表間關(guān)系。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
Node如何后臺(tái)數(shù)據(jù)庫使用增刪改查功能
這篇文章主要介紹了Node如何后臺(tái)數(shù)據(jù)庫使用增刪改查功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
Nodejs 微信小程序消息推送的實(shí)現(xiàn)
這篇文章主要介紹了Nodejs 微信小程序消息推送的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
node鏈接mongodb數(shù)據(jù)庫的方法詳解【阿里云服務(wù)器環(huán)境ubuntu】
這篇文章主要介紹了node鏈接mongodb數(shù)據(jù)庫的方法,結(jié)合實(shí)例形式分析了nodejs基于阿里云服務(wù)器環(huán)境ubuntu下實(shí)現(xiàn)連接MongoDB數(shù)據(jù)庫的相關(guān)操作技巧,需要的朋友可以參考下2019-03-03

