@angelengineering/transcoder
Nativescript 应用程序的视频转码插件
npm i --save @angelengineering/transcoder

@angelengineering/transcoder

Nativescript Transcoder apple android

npm

此插件为 Android API 21+ 和 iOS 4+ 提供了一些音频/视频转码功能。

transcode 允许您将输入的视频/音频文件转码为指定的宽度和/或高度,并生成一个带有 H264 视频编码和 AAC 音频编码的 Mp4 文件。iOS 还支持修改视频帧率以及一些音频设置。

mergeMp4Files 将多个 Mp4 文件合并成一个单一的 Mp4 文件。对于 iOS,此功能目前要求所有输入的 mp4 文件都必须包含音频和视频轨道,但还有一个额外的功能 mergeAudioMp4Files 可以用于合并一组输入 mp4 文件中的所有音频轨道。

对于 Android,convertAudioToMp4 将原生支持的音频文件转换为带有 AAC 音频编码的 Mp4 文件。

对于 Android 和 iOS,所有函数的输出都将保存为使用 H264 和 AAC 编码的 Mp4 文件。

安装

npm install @angelengineering/transcoder --save

或者

ns plugin add @angelengineering/transcoder

基本用法

了解如何使用此插件的最佳方式是研究此存储库中包含的演示应用程序。您可以通过查看 apps/demo/src/plugin-demos/transcoder.ts 了解如何在 TypeScript 应用程序中使用插件。

  1. 导入插件。
import { NativescriptTranscoder } from '@angelengineering/transcoder';
  1. 将视频转码为特定的宽度和/或高度(以下示例使用文件选择器,但您可以使用来自相机或其他来源的视频录制文件)

selectAndTranscodeVideo(): void {
// input
const inputFile = await filePicker(MediaType.VIDEO, false)?.[0];

// output
const outputPath = knownFolders.documents().getFile('transcoded-video.mp4').path;
if (File.exists(outputPath)) {
const file = File.fromPath(outputPath);
// make sure file specified as the output path doesn't exist before starting the transcoding process
file.removeSync();
}
const transcoder = new NativescriptTranscoder();
transcoder
.transcode(
inputFile.path,
outputPath,
{
height: 720,
//width: 1080, //you can also set specific width, both or neither
}//:VideoConfig options
).then(transcodedFile => {
// do something with the transcoded file
})

}

事件

以下事件在转码过程中发出

  • TRANSCODING_STARTED - 在转码过程开始时发出
  • TRANSCODING_PROGRESS - 随时间发出,带有完成百分比(0 到 1)。事件数据中的百分比在 progress
  • TRANSCODING_COMPLETE - 在成功转码过程之后发出,事件数据中的转码文件路径在 output
  • TRANSCODING_ERROR - 当转码过程发出错误时发出。事件数据中的错误字符串在 error

您可以通过将 on 监听器附加到 transcoder 来监听这些事件

  const transcoder = new NativescriptTranscoder()
transcoder.on(NativescriptTranscoder.TRANSCODING_PROGRESS, (payload: MessageData) => {
// IMPORTANT! For iOS you'll have to wrap any UI updates in `executeOnMainThread` as the events are emitted from a different thread
executeOnMainThread(() => {
progressBar.value = payload.data.progress * 100;
});
});

选项

export interface VideoConfig {  
height?: number;
width?: number;
force?: boolean; // force transcoding to allow transcoding to the same or higher quality
frameRate?: number; // iOS only
audioChannels?: number; // iOS only
audioSampleRate?: number; // iOS only
audioBitRate?: number; // iOS only
}

函数

转码插件为处理 Mp4 文件提供了以下函数

函数 描述 返回类型 iOS Android
transcode(inputPath: string, outputPath: string, videoConfig?: VideoConfig) 返回转码的视频文件 Promise<File>
convertAudioToMp4(inputPath: string, outputPath: string) 返回转码的音频文件 Promise<File>
mergeMp4Files(inputFiles: string[], outputPath: string) 返回合并的视频文件 Promise<File>
mergeAudioMp4Files(inputFiles: string[], outputPath: string) 返回合并的音频文件 Promise<File>
getVideoResolution(videoPath: string) 返回视频分辨率(例如 1920x1080 { width: string, height: string }
getVideoSize(videoPath: string) 返回视频大小(字节数) 数字
getVideoSizeString(videoPath: string) 以人类可读的格式返回视频大小(例如 5.5 mb 字符串
getVideoCodec(videoPath: string) 如果找到,则返回视频编解码器 字符串
getAudioCodec(videoPath: string) 如果找到,则返回音频编解码器 字符串
getVideoDuration(videoPath: string) 返回视频的持续时间(毫秒) 数字

故障排除

默认情况下日志是关闭的。如果您想在视频处理时查看日志,可以在开始转码过程之前将日志级别设置为 verbose 来打开它们。这将由于频繁的事件和控制台输出而减慢转码速度。


startTranscoding(): void {
const transcdoer = new Transcoder();
transcoder.setLogLevel('verbose');
transcoder.transcode(...);
}

致谢

此插件基于 iOS 的 NextLevelSessionExporter。对于 Android,此插件使用了 AndroidX Media3 Transformer 库。

许可

Apache 许可证版本 2.0