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

@voicethread/nativescript-transcoder

Nativescript Transcoder apple android

npm

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

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

mergeMp4Files 将多个MP4文件合并为一个,从所有提供的输入MP4文件生成单个MP4文件。对于iOS,此功能目前要求所有MP4输入文件都必须有音频和视频轨道。

对于Android,convertAudioToMp4 将本机支持的音频文件转换为具有AAC音频编码的MP4。

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

安装

npm install @voicethread/nativescript-transcoder --save

或者

ns plugin add @voicethread/nativescript-transcoder

基本用法

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

  1. 导入插件。
import { NativescriptTranscoder } from '@voicethread/nativescript-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
}
).then(transcodedFile => {
// do something with the transcoded file
})

}

事件

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

  • TRANSCODING_STARTED - 在转码过程开始时发出
  • TRANSCODING_PROGRESS - 随时间发出,带有完成百分比(0到1)
  • TRANSCODING_COMPLETE - 在转码过程成功后发出(transcode函数将返回转码后的文件)
  • TRANSCODING_ERROR - 在转码过程发出错误时发出(此时transcode函数将返回一个被拒绝的promise)

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

  const transcoder = new NativescriptTranscoder()
transcoder.on(NativescriptTranscoder.TRANSCODING_PROGRESS, (payload: MessageData) => {
// 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>
getVideoResolution(videoPath: string) 返回视频分辨率(例如 1920x1080 { width: string, height: string }
getVideoSize(videoPath: string) 返回视频大小(以字节为单位) number
getVideoSizeString(videoPath: string) 以人类可读的格式返回视频大小(例如 5.5 mb string
getVideoCodec(videoPath: string) 如果找到,则返回视频编解码器 string
getAudioCodec(videoPath: string) 如果找到,则返回音频编解码器 string
getVideoDuration(videoPath: string) 以毫秒为单位返回视频持续时间 number

故障排除

默认情况下日志是关闭的。如果您想在视频处理过程中查看日志,可以在开始转码过程之前将日志级别设置为verbose来打开它们。


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

注意:并非所有视频/音频编解码器/格式都受到支持,因此转码可能会失败。这在Android上尤其如此,因为设备和操作系统版本决定了实际支持的内容。

致谢

此插件基于iOS的react-native-transcode。对于Android,它使用AndroidX Media3 Transformer库。

许可协议

Apache License Version 2.0