import type * as types from './types/data'; /** * 前端视频编码 * 用法: * * // 初始化实例 * const me = new MovieEncoding({ * workerPath: '...worker.js', // 所用到的worker * fps: 30, // 帧率 * movieData: ... // 视频的json数据 * resolution: '720p', // 分辨率 * times?: [], // 编码区间 * onReady: () => {}, // 准备ok * onProgress: val => {}, // 编码进度 val: { type:'encoderAudio' | 'encoderVideo' | 'sourceLoad', progress: 0~1 } * onFinish: () => {}, // 编码完成 * onError?: err => {}, // 错误 * }); * * // 开始执行,onReady之后执行 * await me.run(); * * // 销毁&终止 * me.destroy(); * * // 下载资源,需要在onFinish中执行 * me.download(); */ export interface ProgressParams { type: 'encoderAudio' | 'encoderVideo' | 'sourceLoad'; progress: number; } export interface MovieEncodingParams { id?: string; workerPath?: string; fps: number; exportName?: string; EModuleEffectSourcePath?: string; resourceHost?: string; format?: 'mp3' | 'mp4'; renderEnv?: 'web' | 'server'; watermark?: types.IWatermark; showFrameIndex?: boolean; onShowSaveFilePicker?: () => void; disabledShowSaveFilePicker?: boolean; movieData: types.MovieData; plugins?: types.PluginConfig[]; resolution: types.Resolution; onReady: () => void; initSuccess: () => void; getMaterialFileUrl?: (url: string) => Promise; onProgress: (p: ProgressParams) => void; onEachSourceProgress?: (n: { src: string; p: number; total: number; }) => void; onFinish: (url: string) => void; onError?: (err: any) => void; times?: [number, number]; } export interface FFmpegArgs { files: { name: string; data: Uint8Array; }[]; arguments: string[]; } export interface CacheFrame { data: Uint8Array; sample: { duration: number | null; timestamp: number; type: string; }; meta: any; } export declare const loadFFmpeg: (baseURL?: string) => Promise; export declare class MovieEncoding { private _params; private _currentTime; private _root; private _movie; private _totalTime; private _endTime; private _startTime; private _muxer; private _bitrate; private _scale; private _encoder; private _drawFrameCount; private _stopDraw; private _remixAudioURL; private _hasEncoderAudio; private _streamTarget; private _frameOverlayStartedAt; constructor(params: MovieEncodingParams); private _onFinish; get remixAudioURL(): string; ffmpegRun(res: FFmpegArgs, type: 'video/mp4' | 'audio/mp3', onProgress?: (info: { ratio: number; time: number; }) => void): Promise; fetchFile(url: String): Promise; fetchFileBuffer(url: String): Promise; downURL(url: string, name: string): void; getAllMedia(): any[]; /** * 获取用户使用的所有资源文件 * @returns */ getUsedMedia(): any[]; /** * 云端合成音频 */ encoderAudioFFmpegCMD(): "" | Promise<{ files: { name: string; data: any; }[]; arguments: string[]; fileType: "audio/mp3"; }>; encoderAudio(): Promise; private encoderAudio2Video; private _fileStream; private _fileHandle; /** * 创建编码器 */ private _createMuxer; private getFormat; private _init; /** * 上报进度完成 */ private _emitProgressDone; /** * 将 file/buffer 转为 URL 并回调 onFinish */ private _emitResult; private _runEnd; /** _runEnd 兜底:封装阶段的任何异常都必须走到 onError, * 否则会以 unhandled rejection 静默吞掉,前端永远停在「正在封装」(2026-10-17) */ private _safeRunEnd; file2Buffer(): any; cache_color: string; private _getExportFrameCount; private _updateFrameOverlay; checkBlockColor: () => Promise; /** * 执行动画 */ run(): Promise; encoderPoster(): Promise; /** * 销毁&终止 */ destroy(): void; /** * 开始下载资源 */ download(): void; }