前端ffmpeg压缩视频

这篇具有很好参考价值的文章主要介绍了前端ffmpeg压缩视频。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

下载ffmpeg

npm install @ffmpeg/core @ffmpeg/ffmpeg

这里需要注意两个插件的版本  "@ffmpeg/core": "^0.10.0",  "@ffmpeg/ffmpeg": "^0.10.1"

配置ffmpeg

安装好插件以后,需要配置一下代码,否则会报错:

1、以VUE为例 在vue.config.js文件中配置请求头

devServer: {
	headers: {
		'Cross-Origin-Opener-Policy': 'same-origin',
		'Cross-Origin-Embedder-Policy': 'require-corp'
	}
}

2、在页面中实例化ffmpeg的时候可能会报找不到模块儿的错误

const ffmpeg = createFFmpeg({
      // ffmpeg路径
      corePath: 'ffmpeg-core.js',
      // 日志
      log: true,
      // 进度
      progress: ({ ratio }) => {
           _this.msg = `完成率: ${(ratio * 100.0).toFixed(1)}%`
      }
})

因此,最好将下载好的插件文件放到public文件夹里面就可以了

vue 压缩视频ffmpeg,ffmpeg,音视频,vue.js,前端

 使用ffmpeg压缩视频

  • 引入ffmpeg
import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg'
  •  文件上传 获取上传的文件
<input id="upload" type="file" accept="video/mp4" capture="camcorder" @change="upload">

注:capture="camcorder" 代表获取手机的摄像头录像   自行查看

  • 实例化ffmpeg
// 实例化ffmpeg
const ffmpeg = createFFmpeg({
      // ffmpeg路径
      corePath: 'ffmpeg-core.js',
      // 日志
      log: true,
      // 进度
      progress: ({ ratio }) => {
          _this.msg = `完成率: ${(ratio * 100.0).toFixed(1)}%`
      }
})
  • 压缩视频
await ffmpeg.load()
this.msg = '开始压缩'
// 把文件加到ffmpeg   写文件
ffmpeg.FS('writeFile', name, await fetchFile(file))
// await ffmpeg.run('-i', name, '-b', '2000000', '-fs', '4194304', '-preset medium', 'superfast', 'put.mp4')
// 开始压缩视频
await ffmpeg.run('-i', name, '-b', '2000000', '-crf', '23', '-fs', '4194304', '-s', resolution, 'put.mp4')
this.msg = '压缩完成'
// 压缩所完成,   读文件  压缩后的文件名称为 put.mp4
const data = ffmpeg.FS('readFile', 'put.mp4')

 名词解释:-b: 比特率(也就是速度大小) -crf: 压缩的视频质量   -fs:  把视频压缩到指定大小(有可能会压缩到指定大小,但是可能会剪切指定大小以后的视频片段并删除超出的部分)  -preset medium:  压缩速度    -s: 分辨率  (可以用于指定视频的分辨率  分辨率越大 压缩时间越慢   越小 时间越快)     put.mp4:压缩完成后的文件名称

  • 压缩完的视频格式是blob格式按照需要可以将视频格式转换成file格式,代码如下:
// 类型转换 blob 转换 file
transToFile (data) {
    console.log(data)
    const _this = this
    var file = []
    // 转换bolb类型
    const blob = new Blob([data], { type: 'text/plain;charset=utf-8' })
    // 这么写是因为文件转换是异步任务
    const transToFile = async (blob, fileName, fileType) => {
        return new window.File([blob], fileName, { type: fileType })
    }
    const textContain = transToFile(blob, 'put.mp4', 'video/mp4')
    // 转换完成后可以将file对象传给接口
    textContain.then((res) => {
        file.push(res)
        console.log('res', res)
    })
    return file
},
  • 如果你嫌压缩的时间太长了,可以控制视频的分辨率   代码如下:
getVideoData () {
    return new Promise((resolve, reject) => {
        const videoElement = document.getElementById('video')
        videoElement.addEventListener('loadedmetadata', function () {
            resolve({
                width: this.videoWidth,
                height: this.videoHeight,
                duration: this.duration
            })
        })
    })
},

拿到视频的宽高,压缩的时候可以等比缩放一下

这里有个坑值得注意一下:如果页面上没有加载出来视频的话,就不会触发得到视频宽高的,需要先把视频加载出来才行  代码如下:

getObjectURL (file) {
    let url = null
    window.URL = window.URL || window.webkitURL
    if (window.URL) {
        url = window.URL.createObjectURL(file)
    } else {
        url = URL.createObjectURL(file)
    }
    return url
}

献上所有代码

<template>
    <div class="video-box">
      <video id="video" controls object-fill="fill"></video><br />
      <input id="upload" type="file" accept="video/mp4" capture="camcorder" @change="upload">
    </div>
</template>

<script>
import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg'
export default {
    data () {
        return {
            msg: '',
            videoWidth: '',
            videoHeight: '',
            duration: ''
        }
    },
    methods: {
        // 选择文件
        async upload (e) {
            console.log('start', e)
            console.log('start', e.target.files[0])
            var _this = this
            if (e.target.files[0]) {
                var filename = e.target.files[0].name
                var filetype = e.target.files[0].type

                const videoUrl = _this.getObjectURL(e.target.files[0])
                const video = document.getElementById('video')
                video.src = videoUrl

                this.getVideoData().then((videoObj) => {
                    const file = e.target.files[0]
                    console.log('videoObj:', videoObj)
                    const { width, height } = videoObj
                    const result = _this.squeezVideo(file, filename, filetype, width, height, _this.msg)
                    result.then(res => {
                        console.log('resultFile', res)
                    })
                })
            }
        },
        // 压缩视频
        async squeezVideo (file, filename, filetype, width, height) {
            console.log('squeezingVideo file name:  ', file.name)
            console.log('squeezingVideo file type:  ', file.type)
            console.log('squeezingVideo file path:  ', file.path)
            console.log('squeezingVideo file size:  ', file.size)
            console.log('squeezingVideo file lastModified:  ', file.lastModified)
            console.log('squeezingVideo file lastModifiedDate:  ', file.lastModifiedDate)
            const _this = this
            // 分辨率
            const resolution = `${width / 2}x${height / 2}`
            // 实例化ffmpeg
            const ffmpeg = createFFmpeg({
                // ffmpeg路径
                corePath: 'ffmpeg-core.js',
                // 日志
                log: true,
                // 进度
                progress: ({ ratio }) => {
                    _this.msg = `完成率: ${(ratio * 100.0).toFixed(1)}%`
                }
            })
            var { name } = file
            this.msg = '正在加载 ffmpeg-core.js'
            // 开始加载
            await ffmpeg.load()
            this.msg = '开始压缩'
            // 把文件加到ffmpeg   写文件
            ffmpeg.FS('writeFile', name, await fetchFile(file))
            // await ffmpeg.run('-i', name, '-b', '2000000', '-fs', '4194304', '-preset medium', 'superfast', 'put.mp4')
            // 开始压缩视频
            await ffmpeg.run('-i', name, '-b', '2000000', '-crf', '23', '-fs', '4194304', '-s', resolution, 'put.mp4')
            this.msg = '压缩完成'
            // 压缩所完成,   读文件  压缩后的文件名称为 put.mp4
            const data = ffmpeg.FS('readFile', 'put.mp4')
            // 转换压缩后的视频格式  当前为 blob 格式
            var filed = _this.transToFile(data)
            console.log('transToFile: ', filed)
            return new Promise((resolve, reject) => {
                if (filed) {
                    resolve({
                        squzingFile: filed
                    })
                }
            })
        },
        // 获取视频的宽高分辨率
        getVideoData () {
            return new Promise((resolve, reject) => {
                const videoElement = document.getElementById('video')
                videoElement.addEventListener('loadedmetadata', function () {
                    resolve({
                        width: this.videoWidth,
                        height: this.videoHeight,
                        duration: this.duration
                    })
                })
            })
        },
        // 获取上传视频的url
        getObjectURL (file) {
            let url = null
            window.URL = window.URL || window.webkitURL
            if (window.URL) {
                url = window.URL.createObjectURL(file)
            } else {
                url = URL.createObjectURL(file)
            }
            return url
        },
        // 类型转换 blob 转换 file
        transToFile (data) {
            console.log(data)
            const _this = this
            var file = []
            // 转换bolb类型
            const blob = new Blob([data], { type: 'text/plain;charset=utf-8' })
            // 这么写是因为文件转换是异步任务
            const transToFile = async (blob, fileName, fileType) => {
                return new window.File([blob], fileName, { type: fileType })
            }
            const textContain = transToFile(blob, 'put.mp4', 'video/mp4')
            // 转换完成后可以将file对象传给接口
            textContain.then((res) => {
                file.push(res)
                console.log('res', res)
                // _this.confirm(file)
            })
            return file
        }
    }
}
</script>

 可以封装压缩视频代码

  • 目录src/utils/ffmpeg.js
import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg'

// 压缩视频
const squeezVideo = async (file, filename, filetype, width, height) => {
    console.log('file', file)
    console.log('filename', filename)
    console.log('filetype', filetype)
    console.log('width', width)
    console.log('height', height)
    // 分辨率
    const resolution = `${width / 2}x${height / 2}`
    // 实例化ffmpeg
    const ffmpeg = createFFmpeg({
        // ffmpeg路径
        corePath: 'ffmpeg-core.js',
        // 日志
        log: true
        // 进度
        // progress: ({ ratio }) => {
        //     msg = `完成率: ${(ratio * 100.0).toFixed(1)}%`
        // }
    })
    console.log('file---', file)
    var { name } = file
    // msg = '正在加载 ffmpeg-core.js'
    // 开始加载
    await ffmpeg.load()
    // msg = '开始压缩'
    // 把文件加到ffmpeg   写文件
    ffmpeg.FS('writeFile', name, await fetchFile(file))
    // await ffmpeg.run('-i', name, '-b', '2000000', '-fs', '4194304', '-preset medium', 'superfast', 'put.mp4')
    // 开始压缩视频
    await ffmpeg.run('-i', name, '-b', '2000000', '-crf', '23', '-fs', '4194304', '-s', resolution, 'put.mp4')
    // msg = '压缩完成'
    // 压缩所完成,   读文件  压缩后的文件名称为 put.mp4
    const data = ffmpeg.FS('readFile', 'put.mp4')
    // 转换压缩后的视频格式  当前为 blob 格式
    var res = transToFile(data, filename, filetype)
    return new Promise((result, reject) => {
        result({
            filed: res
        })
    })
}

// 类型转换 blob 转换 file
const transToFile = (data, filename, filetype) => {
    var filed = []
    console.log(data)
    // 转换bolb类型
    const blob = new Blob([data], { type: 'text/plain;charset=utf-8' })
    // 这么写是因为文件转换是异步任务
    const transToFile = async (blob, fileName, fileType) => {
        return new window.File([blob], fileName, { type: fileType })
    }
    const textContain = transToFile(blob, filename, filetype)
    // 转换完成后可以将file对象传给接口
    textContain.then((res) => {
        filed.push(res)
        console.log('res', res)
    })
    return filed
}
export { squeezVideo }

注意事项:

ffmpeg是一款很强大的视频编辑工具,你可以自己研究研究,上述的代码可以自己封装一下,另外ffmpeg不能用于微信环境或者是企微环境,代码执行不下去。

效果视频

ffmpeg压缩视频

如果各位视频看不到的话,请移步到我的主页进行观看

vue 压缩视频ffmpeg,ffmpeg,音视频,vue.js,前端

 还有一种插件好像可以  video-conversion.js  但是没有找到官网,有小伙伴研究成功的话,踢我一下哈

文章若有不足之处  烦请指正文章来源地址https://www.toymoban.com/news/detail-760650.html

到了这里,关于前端ffmpeg压缩视频的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 音视频 ffmpeg视频裁剪

    将输入视频帧的宽度和高度从x和y值表示的位置裁剪到指定的宽度和高度;x和y是输出的左上角坐标,协调系统的中心是输入视频帧的左上角。 如果使用了可选的keep_aspect参数,将会改变输出SAR(样本宽比)以补偿新的DAR(显示长宽比) 推荐一个零声学院项目课,个人觉得老师讲得不

    2024年02月10日
    浏览(50)
  • 音视频 ffmpeg命令视频录制(Windows)

    先安装dshow软件 Screen Capturer Recorder, 项目地址:https://sourceforge.net/projects/screencapturer/files/ 然后查看可用设备名字:ffmpeg -list_devices true -f dshow -i dummy 录制视频(默认参数) 录制声音(默认参数) 同时录制声音和视频(默认参数) 查看视频录制的可选参数 查看视频录制的可

    2024年02月10日
    浏览(69)
  • [一]ffmpeg音视频解码

    (1)下载FFmpeg源码(v3.3.6) 下载地址( http://www.ffmpeg.org/download.html#releases ) (2)下载NDK(r14b) 下载地址( https://developer.android.google.cn/ndk/downloads/index.html) (3)编写Android编译脚本 (1)用ftp上传到Ubuntu中 (2)解压Ffmpeg(tar -zxvf ffmpeg-3.3.6.tar.gz) (3)解压NDK(unzip andro

    2024年01月19日
    浏览(239)
  • ffmpeg解决bilibili下载的音视频分离问题,将音视频一键合成

    1:到FFmpeg下载安装包,我安装的是windows 下载打包文件 2:解压文件到本地 以下为解压后的文件视图 3:点击进去第一个bin文件,复制该目录,安装到本地环境变量中 然后点击确定进行保存设置 4:ctrl+r打开运行,输入cmd打开命令窗口,输入ffmpeg -version查看版本 安装成功 将所

    2024年02月11日
    浏览(45)
  • ffmpeg系列学习——FFmpeg的音视频处理

    1.音视频的采样率、采样位深度和声道数 音频和视频的采样率、采样位深度和声道数是媒体文件中的重要参数,它们会直接影响到音视频的质量和文件大小。下面对它们进行详细解释: 采样率 采样率指音频每秒钟采样的次数,用赫兹(Hz)表示。采样率越高,音频的还原度越

    2024年02月04日
    浏览(60)
  • Vue 2.0 前端使用 ffmpeg 压缩视频

    1. (我之前因为直接装了导致报错)  要安装这个版本 npm install @ffmpeg/ffmpeg@0.10.1 -S npm install @ffmpeg/core@0.10.0 -S 2.找到vue.config.js devServer: {      headers: {       \\\"Cross-Origin-Opener-Policy\\\": \\\"same-origin\\\",       \\\"Cross-Origin-Embedder-Policy\\\": \\\"require-corp\\\",     }, } 加上红色这段代码 3

    2024年02月09日
    浏览(42)
  • 音视频 ffmpeg命令图片与视频互转

    截取一张图片 转换视频为图片(每帧一张图): 图片转换为视频: 从视频中生成GIF图片 将 GIF 转化为 视频 推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家: 零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核) https://xxetb.xet.tech/s/VsFMs

    2024年02月10日
    浏览(52)
  • 音视频项目—基于FFmpeg和SDL的音视频播放器解析(三)

    介绍 在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本文,可参考我的前一篇文章音视频项目—基于FFmpeg和SDL的音视

    2024年02月05日
    浏览(67)
  • FFMPEG常用命令 音视频合并

            目录 一、音频合并 1.获取音频时长 2.合并两段音频 3.合并音频插入空白 二、视频加背景图 三、音视频合成 1.保留视频声音 2.不保留视频声音 四、合并视频         本文将用几个实例,介绍ffmpeg命令的综合使用,主要涉及音频处理、视频处理和音视频合成。 参数

    2024年02月10日
    浏览(71)
  • Android音视频: 引入FFmpeg

    本文你可以了解到 本文将介绍如何将上一篇文章编译出来的  FFmpeg so  库,引入到  Android  工程中,并验证  so  是否可以正常使用。 一、开启 Android 原生 C/C++ 支持 在过去,通常使用  makefile  的方式在项目中引入  C/C++  代码支持,随着  Android Studio  的普及, makefile  的

    2024年02月02日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包