MIME (Multipurpose Internet Mail Extensions)
- 媒体类型(通常称为 Multipurpose Internet Mail Extensions 或 MIME 类型 )是一种标准,用来表示文档、文件或字节流的性质和格式。
- 通用结构
type/subtype
- 独立类型
text 表明文件是普通文本 text/plain, text/html, text/css, text/javascript
image 表明是某种图像。 image/gif, image/png, image/jpeg, image/bmp, image/webp, image/x-icon, image/vnd.microsoft.icon
audio 音频文件 audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav
video 视频文件 video/webm, video/ogg
application 二进制数据 application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, application/xml, application/pdf
- Multipart 类型
multipart/form-data
multipart/byteranges
视频文件的 mime
- 如下例子
- audio/mp4; codecs="mp4v,mp4a.40.2"; profiles="isom,iso2,mp41"
- video/mp4; codecs="mp4a.40.2,avc1.64001f"; profiles="mp42,isom" // H.264
- video/mp4; codecs="hev1.1.6.L120.90,mp4a.40.2"; profiles="isom,iso2,mp41" // H.265
- video/mp4; codecs="vp09.00.40.08,mp4a.40.2"; profiles="isom,iso2,mp41" // vp9
- 语法介绍
- 第一部分为媒体类型
- codec,视频的压缩算法,可以有多个逗号分隔
- profile,其他描述信息,具体我也没看懂,可以有多个,逗号分隔
市面常用的 codecs
- H.264 Mpeg-4 AVC (高级视频编码), codecs 包含 avc 都是 H.264 编码
- H.265 HEVC (高效视频编码) , codecs 包含 hev
- VP9 由谷歌开发作为一种开放和自由的视频压缩标准
浏览器支持情况
js 如何查看视频编码
- mp4box
- 代码示例
// 浏览器
const arrayBuffer = await file.arrayBuffer();
// nodejs
// const buffer = await fs.promises.readFile(video_path);
// const arrayBuffer = new Uint8Array(buffer).buffer
arrayBuffer.fileStart = 0;
return new Promise((resolve, reject) => {
try {
var mp4BoxFile = MP4Box.createFile();
mp4BoxFile.onError = () => reject(false);
mp4BoxFile.onReady = (info: any) => {
console.log("info", info.mime);
const result = this.getCodecValid(info.mime);
resolve(result);
};
mp4BoxFile.appendBuffer(arrayBuffer);
mp4BoxFile.flush();
} catch (error) {
reject(error);
}
});
视频转码
typescript
import ffmpeg from "fluent-ffmpeg";
import { path as ffmpegPath } from "@ffmpeg-installer/ffmpeg";
ffmpeg.setFfmpegPath(ffmpegPath);
ffmpeg(inputPath)
.videoCodec("libx264") // Codec 可调用命令 ffmpeg -codecs 查看所有支持的格式
.inputFPS(25) // FPS
.videoBitrate(2000) // BPS
.on("error", function (err) {
console.log("err", err);
})
.on("end", async function () {
console.log("Processing finished !");
})
.save(outputPath);