mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
Merge pull request #4984 from WakelessSloth56/preview-features
[插件 - 下载视频 - WASM 混流输出] 修复写入元数据选项, 新增混流进度, 优化多集下载
This commit is contained in:
commit
e27816a91d
@ -33,7 +33,7 @@ export default Vue.extend({
|
||||
},
|
||||
methods: {
|
||||
saveOptions() {
|
||||
options.muxWithMetadata = this.muxExtraAssets
|
||||
options.muxWithMetadata = this.muxWithMetadata
|
||||
Object.assign(storedOptions, options)
|
||||
},
|
||||
},
|
||||
|
||||
@ -17,7 +17,9 @@ enum FFMessageType {
|
||||
EXEC = 'EXEC',
|
||||
WRITE_FILE = 'WRITE_FILE',
|
||||
READ_FILE = 'READ_FILE',
|
||||
DELETE_FILE = 'DELETE_FILE',
|
||||
ERROR = 'ERROR',
|
||||
PROGRESS = 'PROGRESS',
|
||||
}
|
||||
|
||||
export class FFmpeg {
|
||||
@ -25,6 +27,8 @@ export class FFmpeg {
|
||||
#resolves: Callbacks = {}
|
||||
#rejects: Callbacks = {}
|
||||
|
||||
#progressEventCallback: (event: ProgressEvent) => void
|
||||
|
||||
public loaded = false
|
||||
|
||||
#registerHandlers = () => {
|
||||
@ -38,8 +42,14 @@ export class FFmpeg {
|
||||
case FFMessageType.EXEC:
|
||||
case FFMessageType.WRITE_FILE:
|
||||
case FFMessageType.READ_FILE:
|
||||
case FFMessageType.DELETE_FILE:
|
||||
this.#resolves[id](data)
|
||||
break
|
||||
case FFMessageType.PROGRESS:
|
||||
if (this.#progressEventCallback) {
|
||||
this.#progressEventCallback(<ProgressEvent>data)
|
||||
}
|
||||
break
|
||||
case FFMessageType.ERROR:
|
||||
this.#rejects[id](data)
|
||||
break
|
||||
@ -140,6 +150,20 @@ export class FFmpeg {
|
||||
undefined,
|
||||
signal,
|
||||
) as Promise<Uint8Array>
|
||||
|
||||
public deleteFile = (path: string, signal?: AbortSignal) =>
|
||||
this.#send(
|
||||
{
|
||||
type: FFMessageType.DELETE_FILE,
|
||||
data: { path },
|
||||
},
|
||||
undefined,
|
||||
signal,
|
||||
) as Promise<boolean>
|
||||
|
||||
public onProgress(callback: (event: ProgressEvent) => void): void {
|
||||
this.#progressEventCallback = callback
|
||||
}
|
||||
}
|
||||
|
||||
// ========================================================================== //
|
||||
@ -165,18 +189,28 @@ interface FFMessageReadFileData {
|
||||
encoding: string
|
||||
}
|
||||
|
||||
interface FFMessageDeleteFileData {
|
||||
path: string
|
||||
}
|
||||
|
||||
type FFMessageData =
|
||||
| FFMessageLoadConfig
|
||||
| FFMessageExecData
|
||||
| FFMessageWriteFileData
|
||||
| FFMessageReadFileData
|
||||
| FFMessageDeleteFileData
|
||||
|
||||
interface Message {
|
||||
type: string
|
||||
data?: FFMessageData
|
||||
}
|
||||
|
||||
type CallbackData = Uint8Array | string | boolean | Error | undefined
|
||||
interface ProgressEvent {
|
||||
progress: number
|
||||
time: number
|
||||
}
|
||||
|
||||
type CallbackData = Uint8Array | string | boolean | Error | ProgressEvent | undefined
|
||||
|
||||
interface Callbacks {
|
||||
[id: number | string]: (data: CallbackData) => void
|
||||
|
||||
@ -2,6 +2,7 @@ import { DownloadPackage, PackageEntry } from '@/core/download'
|
||||
import { meta } from '@/core/meta'
|
||||
import { getComponentSettings } from '@/core/settings'
|
||||
import { Toast } from '@/core/toast'
|
||||
import { formatPercent } from '@/core/utils/formatters'
|
||||
import { title as pluginTitle } from '.'
|
||||
import type { Options } from '../../../../components/video/download'
|
||||
import { DownloadVideoAction } from '../../../../components/video/download/types'
|
||||
@ -59,13 +60,13 @@ async function single(
|
||||
httpGet(audioUrl, progress(1, '正在下载音频流')),
|
||||
])
|
||||
|
||||
ffmpeg.writeFile('video', video)
|
||||
ffmpeg.writeFile('audio', audio)
|
||||
await ffmpeg.writeFile('video', video)
|
||||
await ffmpeg.writeFile('audio', audio)
|
||||
|
||||
const args = ['-i', 'video', '-i', 'audio']
|
||||
|
||||
if (ffmetadata) {
|
||||
ffmpeg.writeFile('ffmetadata', new TextEncoder().encode(ffmetadata))
|
||||
await ffmpeg.writeFile('ffmetadata', new TextEncoder().encode(ffmetadata))
|
||||
args.push('-i', 'ffmetadata', '-map_metadata', '2')
|
||||
if (!outputMkv) {
|
||||
args.push('-movflags', '+use_metadata_tags')
|
||||
@ -76,7 +77,9 @@ async function single(
|
||||
|
||||
console.debug('FFmpeg commandline args:', args.join(' '))
|
||||
|
||||
toast.message = '混流中……'
|
||||
ffmpeg.onProgress(event => {
|
||||
toast.message = `混流中: ${formatPercent(event.progress)}`
|
||||
})
|
||||
await ffmpeg.exec(args)
|
||||
|
||||
const output = await ffmpeg.readFile('output')
|
||||
@ -87,6 +90,13 @@ async function single(
|
||||
toast.message = '完成!'
|
||||
toast.duration = 1000
|
||||
|
||||
await Promise.all([
|
||||
ffmpeg.deleteFile('video'),
|
||||
ffmpeg.deleteFile('audio'),
|
||||
ffmpeg.deleteFile('output'),
|
||||
ffmetadata ? ffmpeg.deleteFile('ffmetadata') : Promise.resolve(),
|
||||
])
|
||||
|
||||
await DownloadPackage.single(
|
||||
name.replace(/.[^/.]+$/, `.${outputMkv ? 'mkv' : 'mp4'}`),
|
||||
outputBlob,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user