Использованы сторонние библиотеки: 👉👉 ffmpeg.wasm
npm
Пакет называется так 👉👉 @ffmpeg/ffmpeg
Давайте сначала изучим основные принципы использования этой библиотеки All. API
Это все там.
Установить
npm install @ffmpeg/ffmpeg @ffmpeg/core -S
Экспортируйте эти два метода в модуль createFFmpeg
, fetchFile
。
import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg';
createFFmpeg
это творение ffmpeg
Фабричная функция для экземпляра.
import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg';
const ffmpeg = createFFmpeg({})
Параметры следующие
ffmpeg-core.js
путь загрузки.
false
({ message }) => console.log(message)
p => console.log(p)
ffmpeg.load()
Вернуть Promise
,используется для загрузки ffmpeg-core.js
основной пакет,в среде браузера,ffmpeg.wasm-core
Скрипт по умолчанию CDN
Получено из , вы можете создать ffmpeg
экземпляр пройден corePath
чтобы указать локальный путь.
(async () => {
await ffmpeg.load();
})();
ffmpeg.run(...args)
Вернуть Promise
,На официальном сайте написано, что этот метод аналогичен родному ffmpeg
То же самое, параметры которые нужно передать тоже те же, но я не знаю как использовать родной 😂😂, забудь, просто умей им пользоваться.
(async () => {
/* Эквивалентно выполнению `$ ffmpeg -i flame.avi -s 1920x1080 output.mp4` */
await ffmpeg.run('-i', 'flame.avi', '-s', '1920x1080', 'output.mp4');
})();
ffmpeg
Описание параметра:
параметр | иллюстрировать |
---|---|
Основные параметры: | |
-formats | Вывод всех доступных форматов |
-f fmt | Укажите формат (аудио или видео формат) |
-i filename | Укажите имя входного файла. Конечно, в Linux вы также можете указать: 0.0 (запись экрана) или камеру. |
-y | Перезаписать существующие файлы |
-t duration | Продолжительность записи t |
-fs limit_size | Установить максимальный размер файла |
-ss time_off | Начиная с указанного времени(с), также поддерживается формат [-]чч:мм:сс[.xxx]. |
-itsoffset time_off | Установите смещение времени (сек), эта опция влияет на все последующие входные файлы. Это смещение добавляется к временной метке входного файла, определяя положительное смещение, означающее, что соответствующий поток задерживается на смещение в секундах. Также поддерживается формат [-]чч:мм:сс[.xxx]. |
-title string | заголовок |
-timestamp time | Временная метка |
-author string | автор |
-copyright string | Информация об авторских правах |
-comment string | Комментарий |
-album string | название альбома |
-v verbose | связанный с журналом |
-target type | Установите тип целевого файла («vcd», «svcd», «dvd», «dv», «dv50», «pal-vcd», «ntsc-svcd», ...) |
-dframes number | Установите количество кадров для записи |
Варианты видео: | |
-b | Укажите битрейт (бит/с). Кажется, ffmpeg автоматически VBR. Если вы его укажете, то, скорее всего, это будет средний битрейт. |
-bitexact | Используйте стандартный битрейт |
-vb | Укажите битрейт видео (бит/с) |
-vframes number | Установите, сколько кадров видео конвертировать |
-r rate | Частота кадров (fps) (можно изменить, подтвердите, что нестандартная частота кадров приведет к рассинхронизации звука и видео, поэтому ее можно установить только на 15 или 29,97) |
-s size | Укажите разрешение (320x240) |
-aspect aspect | Установите соотношение сторон видео (4:3, 16:9 или 1,3333, 1,7777). |
-croptop size | Установить размер верхнего выреза (в пикселях) |
-cropbottom size | Установить размер нижнего выреза (в пикселях) |
-cropleft size | Установить размер выреза слева (в пикселях) |
-cropright size | Установите правильный размер выреза (в пикселях) |
-padtop size | Установить размер верхнего отступа (в пикселях) |
-padbottom size | Нижнее отступы (в пикселях) |
-padleft size | Отступы слева (в пикселях) |
-padright size | Отступы справа (в пикселях) |
-padcolor color | Дополнить цветом (000000-FFFFFF) |
-vn | Отменить видео |
-vcodec codec | Принудительное использование кодека кодирования и декодирования («копировать» для копирования потока) |
-sameq | Используйте то же качество видео, что и у источника (VBR). |
-pass n | Выберите количество проходов обработки (1 или 2). Двухпроходное кодирование очень полезно. Первый проход генерирует статистическую информацию, а второй проход генерирует точную запрошенную скорость кода. |
-passlogfile file | Дважды выберите имя файла записи. |
-newvideo | Добавить новый видеопоток после текущего видеопотока |
Расширенные параметры видео: | |
-pix_fmt format | set pixel format, 'list' as argument shows all the pixel formats supported |
-intra | Только внутрикадровое кодирование |
-qscale q | к<числовое значение>основанный на качествеVBR,Значение 0,01–255,Чем меньше, тем лучше качество |
-loop_input | Установите количество циклов для входного потока (в настоящее время действует только для изображений) |
-loop_output | Установите количество циклов для выходного видео. Например, при выводе gif установите его на 0, чтобы указать бесконечное циклическое воспроизведение. |
-g int | Установить размер группы изображений |
-cutoff int | Установить частоту среза |
-qmin int | Установите минимальную массу, общую с -qmax (установите максимальную массу), например -qmin 10 -qmax 31 |
-qmax int | Установите максимальное качество |
-qdiff int | Максимальное отклонение количественной оценки между шкалами (VBR) |
-bf int | Используйте кадры B, поддержка mpeg1, mpeg2, mpeg4. |
Варианты аудио: | |
-ab | Установите скорость передачи данных (единица измерения: бит/с, возможно, старая версия — кбит/с). Если для параметра -ac установлено значение стерео, установите половину скорости передачи данных. Например, если она составляет 192 кбит/с, установите значение 96. Скорость передачи данных по умолчанию для преобразования меньше, поэтому вам необходимо установить ее на половину скорости передачи данных. Если вы хотите слышать звук более высокого качества, рекомендуется установить ее на значение 160 кбит/с (80) или выше. |
-aframes number | Установите количество кадров аудио для конвертации |
-aq quality | Установить качество звука (указать кодировку) |
-ar rate | Установите частоту дискретизации звука (единица измерения: Гц), PSP распознает только 24000. |
-ac channels | Установите количество каналов, 1 моно, 2 стерео, 1 можно использовать для конвертации моно канала ТВрип (экономия половины емкости), а 2 для качественного DVDрипа. |
-an | Отменить звук |
-acodec codec | Укажите кодировку звука («копировать», чтобы скопировать поток) |
-vol volume | Установите громкость записи (по умолчанию 256). <процент> , громкость дорожки AC3 на некоторых DVD-рипах очень низкая. Вы можете использовать это для увеличения громкости при конвертации. Например, 200 — это вдвое больше исходной громкости. |
-newaudio | Добавить новый аудиопоток после текущего аудиопотока |
Варианты субтитров: | |
-sn | Отменить субтитры |
-scodec codec | Установите кодировку субтитров («копировать», чтобы скопировать поток) |
-newsubtitle | Добавить после текущих субтитров |
-slang code | Установите кодировку ISO 639, используемую для субтитров (3 буквы). |
Параметры копирования аудио/видео: | |
-vc channel | Установить канал видеозахвата (только для DV1394) |
-tvstd standard | Установите ТВ-стандарт NTSC PAL(SECAM) |
ffmpeg.FS(method, ...args)
раньше бегал FS
действовать.
для ffmpeg.wasm
файлы ввода/вывода, их необходимо сохранить в MEMFS
так что ffmpeg.wasm
уметь ими пользоваться. Здесь мы опираемся на Emscripten
предоставил FS
Метод ♂️.
Параметры следующие
/* Write data to MEMFS, need to use Uint8Array for binary data */
// Пучок файл хранится в памяти
ffmpeg.FS('writeFile', 'video.avi', new Uint8Array(...));
/* Read data from MEMFS */
// прочитать в памяти
ffmpeg.FS('readFile', 'video.mp4');
/* Delete file in MEMFS */
// удалить в памяти
ffmpeg.FS('unlink', 'video.mp4');
ffmpeg.exit()
Используется для прекращения выполнения программы и одновременного ее удаления. MEMFS
чтобы освободить память.
ffmpeg.setLogging(logging)
Управляет выводом информации журнала на консоль.
Параметры следующие
ffmpeg.setLogging(true);
ffmpeg.setLogger(logger)
Ставь и получай ffmpeg.wasm
выходное сообщение. .
Параметры следующие
ffmpeg.setLogger(({ type, message }) => {
console.log(type, message);
/*
* type can be one of following:
*
* info: internal workflow debug messages
* fferr: ffmpeg native stderr output
* ffout: ffmpeg native stdout output
*/
});
ffmpeg.setProgress(progress)
Обработчик прогресса для получения ffmpeg
Текущий прогресс команды.
Параметры следующие
ffmpeg.setProgress(({ ratio }) => {
console.log(ratio);
/*
* ratio is a float number between 0 to 1. 0 приезжать число между 1
*/
});
fetchFile(media)
Вернуть Promise
, Используется для получения файлов с различных ресурсов. Видео/аудиофайлы, подлежащие обработке, могут находиться удаленно. URL
или где-то в локальной файловой системе. Эта функция поможет вам получить файл и Вернуть Uint8Array
переменное предложение ffmpeg.wasm
использовать.
Параметры следующие
URL
нить、base64
строка или File
、Blob
、Buffer
объект.(async () => {
const data = await fetchFile('https://github.com/ffmpegwasm/testdata/raw/master/video-3s.avi');
/*
* data will be in Uint8Array format
*/
})();
corePath
Поддержка введения cdn
const ffmpeg = createFFmpeg({
corePath: 'https://unpkg.com/@ffmpeg/core@0.8.5/dist/ffmpeg-core.js',
})
Но бизнес должен быть развернут в интрасети, и доступ к нему невозможен. cdn
,к счастью corePath
Также поддерживается загрузка локальных файлов.
Он должен поддерживать абсолютные пути и будет доступен по умолчанию. public
файл ниже.
const ffmpeg = createFFmpeg({
corePath: 'ffmpeg-core.js',
})
Пучок node_modules\@ffmpeg\core\dist
Скопируйте следующие три файла в public
середина.
При создании экземпляра передайте log: true
,Включите ведение журнала.
const ffmpeg = createFFmpeg({
log: true,
})
Вы также можете пройти ffmpeg.setLogger
Пользовательский формат журнала, например
ffmpeg.setLogger(({ type, message }) => {
console.log('🚀🚀 ~ message', message);
console.log('🚀🚀 ~ type', type);
});
Вы также можете передать его непосредственно при создании экземпляра. logger
Свойства и эффекты такие же, рекомендуется Пучок. log
Свойства изменены на false
,В противном случае журналы будут дублироваться.
const ffmpeg = createFFmpeg({
corePath: 'ffmpeg-core.js',
log: false,
logger: ({ type, message }) => {
console.log('🚀🚀 ~ message', message);
console.log('🚀🚀 ~ type', type);
}
})
Как узнать прогресс загрузки файлов можно использовать? ffmpeg.setProgress
ffmpeg.setProgress(({ ratio }) => {
console.log('🚀🚀 ~ ratio', ratio);
});
Вы также можете передать его непосредственно при создании экземпляра. progress
Свойства и эффекты те же.
const ffmpeg = createFFmpeg({
corePath: 'ffmpeg-core.js',
log: false,
progress: ({ ratio }) => {
console.log('🚀🚀 ~ ratio', ratio);
}
})
Если возникает следующая ошибка
При локальной разработке вам необходимо vue.config.js
Добавить
devServer: {
headers: {
"Cross-Origin-Opener-Policy": "same-origin",
"Cross-Origin-Embedder-Policy": "require-corp",
},
}
в случае vite
Проект изменен следующим образом vite.config.ts
plugins: [
vue(),
vueJsx(),
{
name: 'configure-response-headers',
configureServer: server => {
server.app.use('/node_modules/',(_req, res, next) => {
res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp');
res.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
next();
});
}
}
],
При развертывании требуется настройка nginx
Или настройте его на бэкэнде.
add_header Cross-Origin-Opener-Policy same-origin;
add_header Cross-Origin-Embedder-Policy require-corp;
Используем функцию загрузки файла IView
Компонент загрузки библиотеки компонентов в основном имеет компонент загрузки, и принцип тот же.
Компоненты страницы
main.vue
<template>
<div style="width:100%; height:100%; background-color: #DAE4E4;padding:50px">
<upload-btn @before-upload="beforeUpload"></upload-btn>
<video-ref :video-file-url="videoFileUrl"></video-ref>
</div>
</template>
<script>
import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg'
import videoRef from '../../components/video/Video.vue'
import UploadBtn from '../../components/video/UploadBtn.vue'
export default {
data() {
return {
ffmpeg: {},
videoFileUrl: "",
}
},
components: {
videoRef,
UploadBtn
},
computed: {},
methods: {
// Логика инициализации страницы
async init() {
await this.initFfmpeg()
},
// инициализация ffmpeg Функция
async initFfmpeg() {
this.ffmpeg = createFFmpeg({
corePath: 'ffmpeg-core.js',
log: true,
})
},
// Подключайте перед загрузкой файлов
async beforeUpload(file) {
console.log('🚀🚀 beforeUpload ~ file', file);
await this.ffmpeg.load();
await this.getVideoFileUrl(file)
},
async getVideoFileUrl(file) {
// Получить файлы ресурсов
const result = await fetchFile(file)
console.log('🚀🚀 ~ result', result);
// для ffmpeg.wasm файлы ввода/вывода, их необходимо сохранить в MEMFS так что ffmpeg.wasm умею ими пользоваться
this.ffmpeg.FS('writeFile', `${file.name}`, result);
await this.ffmpeg.run('-i', `${file.name}`, '-acodec', 'aac', '-vcodec', 'libx264', '-y', `${file.name.split('.')[0]}.mp4`);
// прочитать в памятидокумент
const data = this.ffmpeg.FS('readFile', `${file.name.split('.')[0]}.mp4`);
// Получить адрес воспроизведения в памяти
this.videoFileUrl = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' }))
console.log('🚀🚀 ~ this.videoFileUrl', this.videoFileUrl);
}
},
async mounted() {
// Логика инициализации страницы
await this.init()
}
}
</script>
Кнопка загрузки подкомпонента
UploadBtn.vue
<template>
<div class="upload-btn">
<i-upload :before-upload="beforeUpload"
:show-upload-list="false"
action=""
name="file"
accept="video/*">
<i-button>Нажмите, чтобы загрузить видео</i-button>
<br>
<br>
</i-upload>
</div>
</template>
<script>
export default {
methods: {
// Подключайте перед загрузкой файлов
async beforeUpload(file) {
this.$emit("before-upload", file)
},
}
}
</script>
Видеопроигрыватель дочерних компонентов
Video.vue
// Для воспроизведения видео мы используем `HTML5` собственный тег `video`。
<template>
<div class="video-box">
<video id="videoRef"
ref="videoRef"
v-if="videoFileUrl"
class="videoRef"
controls>
<source :src="videoFileUrl"
type="video/mp4" />
</video>
</div>
</template>
<script>
export default {
props: {
videoFileUrl: {
default: () => (''),
},
},
}
</script>