[Практические навыки] Используйте ffmpeg во внешнем интерфейсе для воспроизведения локальных видео.
[Практические навыки] Используйте ffmpeg во внешнем интерфейсе для воспроизведения локальных видео.

Предисловие

Использованы сторонние библиотеки: 👉👉 ffmpeg.wasm

npm Пакет называется так 👉👉 @ffmpeg/ffmpeg

ffmpeg.wasm

Давайте сначала изучим основные принципы использования этой библиотеки All. API Это все там.

Установить

Язык кода:javascript
копировать
npm install @ffmpeg/ffmpeg @ffmpeg/core -S

Экспортируйте эти два метода в модуль createFFmpeg, fetchFile

Язык кода:javascript
копировать
import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg';

createFFmpeg

createFFmpeg это творение ffmpeg Фабричная функция для экземпляра.

Язык кода:javascript
копировать
import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg';

const ffmpeg = createFFmpeg({})

Параметры следующие

  • corePath: обозначение ffmpeg-core.js путь загрузки.
  • log: Открыть ли все журналы, по умолчанию false
  • logger: Функция для получения сообщений журнала, например: ({ message }) => console.log(message)
  • progress: Функция для отслеживания прогресса, например: p => console.log(p)

ffmpeg.load

ffmpeg.load() Вернуть Promise,используется для загрузки ffmpeg-core.js основной пакет,в среде браузера,ffmpeg.wasm-core Скрипт по умолчанию CDN Получено из , вы можете создать ffmpeg экземпляр пройден corePath чтобы указать локальный путь.

Язык кода:javascript
копировать
(async () => {
  await ffmpeg.load();
})();

ffmpeg.run

ffmpeg.run(...args) Вернуть Promise,На официальном сайте написано, что этот метод аналогичен родному ffmpeg То же самое, параметры которые нужно передать тоже те же, но я не знаю как использовать родной 😂😂, забудь, просто умей им пользоваться.

Язык кода:javascript
копировать
(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

к<числовое значение&gt;основанный на качестве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

ffmpeg.FS(method, ...args) раньше бегал FS действовать.

для ffmpeg.wasm файлы ввода/вывода, их необходимо сохранить в MEMFS так что ffmpeg.wasm уметь ими пользоваться. Здесь мы опираемся на Emscripten предоставил FS Метод ♂️.

Параметры следующие

  • method:  Имя метода, который необходимо выполнить.
  • args: параметр, соответствующий методу выполнения.
Язык кода:javascript
копировать
/* 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

ffmpeg.exit() Используется для прекращения выполнения программы и одновременного ее удаления. MEMFS чтобы освободить память.

ffmpeg.setLogging

ffmpeg.setLogging(logging) Управляет выводом информации журнала на консоль.

Параметры следующие

  • logging:  Включите/выключите сообщения журнала в консоли.
Язык кода:javascript
копировать
ffmpeg.setLogging(true);

ffmpeg.setLogger

ffmpeg.setLogger(logger) Ставь и получай ffmpeg.wasm выходное сообщение. .

Параметры следующие

  • logger:  Функции, обрабатывающие сообщения.
Язык кода:javascript
копировать
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

ffmpeg.setProgress(progress) Обработчик прогресса для получения ffmpeg Текущий прогресс команды.

Параметры следующие

  • progress:  Функция, которая обрабатывает информацию о ходе выполнения.
Язык кода:javascript
копировать
ffmpeg.setProgress(({ ratio }) => {
  console.log(ratio);
  /*
   * ratio is a float number between 0 to 1. 0 приезжать число между 1
   */
});

fetchFile

fetchFile(media) Вернуть Promise, Используется для получения файлов с различных ресурсов. Видео/аудиофайлы, подлежащие обработке, могут находиться удаленно. URL или где-то в локальной файловой системе. Эта функция поможет вам получить файл и Вернуть Uint8Array переменное предложение ffmpeg.wasm использовать.

Параметры следующие

  • media: URL нить、base64 строка или FileBlobBuffer объект.
Язык кода:javascript
копировать
(async () => {
  const data = await fetchFile('https://github.com/ffmpegwasm/testdata/raw/master/video-3s.avi');
  /*
   * data will be in Uint8Array format
   */
})();

Пополнить

Установить corePath

corePath Поддержка введения cdn

Язык кода:javascript
копировать
const ffmpeg = createFFmpeg({
  corePath: 'https://unpkg.com/@ffmpeg/core@0.8.5/dist/ffmpeg-core.js',
})

Но бизнес должен быть развернут в интрасети, и доступ к нему невозможен. cdn,к счастью corePath Также поддерживается загрузка локальных файлов.

Он должен поддерживать абсолютные пути и будет доступен по умолчанию. public файл ниже.

Язык кода:javascript
копировать
const ffmpeg = createFFmpeg({
  corePath: 'ffmpeg-core.js',
})

Пучок node_modules\@ffmpeg\core\dist Скопируйте следующие три файла в public середина.

Журнал установки

При создании экземпляра передайте log: true,Включите ведение журнала.

Язык кода:javascript
копировать
const ffmpeg = createFFmpeg({
  log: true,
})

Вы также можете пройти ffmpeg.setLogger Пользовательский формат журнала, например

Язык кода:javascript
копировать
ffmpeg.setLogger(({ type, message }) => {
  console.log('🚀🚀 ~ message', message);
  console.log('🚀🚀 ~ type', type);
});

Вы также можете передать его непосредственно при создании экземпляра. logger Свойства и эффекты такие же, рекомендуется Пучок. log Свойства изменены на false,В противном случае журналы будут дублироваться.

Язык кода:javascript
копировать
const ffmpeg = createFFmpeg({
  corePath: 'ffmpeg-core.js',
  log: false,
  logger: ({ type, message }) => {
    console.log('🚀🚀 ~ message', message);
    console.log('🚀🚀 ~ type', type);
  }
})

Добейтесь прогресса

Как узнать прогресс загрузки файлов можно использовать? ffmpeg.setProgress

Язык кода:javascript
копировать
ffmpeg.setProgress(({ ratio }) => {
  console.log('🚀🚀 ~ ratio', ratio);
});

Вы также можете передать его непосредственно при создании экземпляра. progress Свойства и эффекты те же.

Язык кода:javascript
копировать
const ffmpeg = createFFmpeg({
  corePath: 'ffmpeg-core.js',
  log: false,
  progress: ({ ratio }) => {
    console.log('🚀🚀 ~ ratio', ratio);
  }
})

Устранение ошибок

Если возникает следующая ошибка

При локальной разработке вам необходимо vue.config.js Добавить

Язык кода:javascript
копировать
devServer: {
    headers: {
      "Cross-Origin-Opener-Policy": "same-origin",
      "Cross-Origin-Embedder-Policy": "require-corp",
    },
}

в случае vite Проект изменен следующим образом vite.config.ts

Язык кода:javascript
копировать
 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 Или настройте его на бэкэнде.

Язык кода:javascript
копировать
add_header Cross-Origin-Opener-Policy same-origin; 
add_header Cross-Origin-Embedder-Policy require-corp;

Загрузить видео локально

Используем функцию загрузки файла IView Компонент загрузки библиотеки компонентов в основном имеет компонент загрузки, и принцип тот же.

Компоненты страницы main.vue

Язык кода:javascript
копировать
<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

Язык кода:javascript
копировать
<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

Язык кода:javascript
копировать
// Для воспроизведения видео мы используем `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>
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose