瀏覽代碼

用ffmpeg解析元数据的时候如果有中文乱码采用第二次尝试用华为的接口提取元数据

onecold 10 月之前
父節點
當前提交
ac38541b92
共有 1 個文件被更改,包括 63 次插入4 次删除
  1. 63 4
      entry/src/main/ets/common/util/Utility.ets

+ 63 - 4
entry/src/main/ets/common/util/Utility.ets

@@ -8,6 +8,7 @@ import {
   PreferencesUtil,
   RandomUtil, StrUtil } from '@pura/harmony-utils';
 import { media } from '@kit.MediaKit';
+import * as chardet from '@changwei/chardet';
 import fs, { ReadTextOptions } from '@ohos.file.fs';
 import { image } from '@kit.ImageKit';
 import fileIo from '@ohos.file.fs';
@@ -24,6 +25,8 @@ import { pinyin4js } from '@ohos/pinyin4js';
 import { VipData } from '../../viewmodel/VipData';
 import { VipPage } from '../../pages/VipPage';
 import { FFmpeg, FFProgressMessageParser } from '@sj/ffmpeg';
+import { util } from '@kit.ArkTS';
+import { UniversalDetector } from '@ohos/juniversalchardet';
 
 export interface FFMpegTags {
   album?: string;
@@ -831,6 +834,7 @@ export class Utility {
       let commands = ["ffprobe", "-v", "quiet", "-print_format", "json", "-show_format", "-show_streams", inputPath];
       let outputJson = "";
 
+
       FFmpeg.execute(commands,  {
         logCallback: (logLevel: number, logMessage: string) => console.log(`[${logLevel}]${logMessage}`),
         outputCallback: (message: string) => {
@@ -872,11 +876,19 @@ export class Utility {
             const tags = format.tags  || {};
             let artist = tags.artist ||tags.ARTIST || '';
             let title = tags.title ||tags.TITLE || '';
-            const album = tags.album ||tags.ALBUM|| '';
+            let album = tags.album ||tags.ALBUM|| '';
             console.log(`onecold tags.tags:${JSON.stringify(tags)}`);
-            // console.log(`onecold tags.LYRICS:${tags.LYRICS}`);
-            // console.log(`onecold tags.lyrics:${tags.lyrics}`);
-            // console.log(`onecold tags.UNSYNCEDLYRICS:${tags.UNSYNCEDLYRICS}`);
+            // 检查是否有乱码
+            if (hasGarbledText(tags))  {
+              // 第二次尝试用华为的接口提取元数据
+              let  hwTags = await extractHwMediaMetadata(inputPath)
+              artist = hwTags?.artist|| '';
+              title = hwTags?.title|| '';
+              album = hwTags?.album|| '';
+              console.info('onecold 乱码修正 artist='+artist);
+              console.info('onecold 乱码修正 title='+title);
+              console.info('onecold 乱码修正 album='+album);
+            }
             if(StrUtil.isEmpty(title)){
               //自动解析像这样的获取不到元数据的 周杰伦-七里香.mp3文件
               console.log(`onecold musicName为空:${file.name}`);
@@ -2008,4 +2020,51 @@ function getFileFormatByPath(filePath: string): string {
   return filePath.substring(lastDotIndex  + 1).toLowerCase();
 }
 
+// 检查乱码的简单方法
+function hasGarbledText(tags: FFMpegTags): boolean {
+  if (!tags) return false;
+  const text = [tags.title, tags.artist,  tags.album].join("");
+  return /[À-ÿµØÇò]/.test(text); // 匹配常见乱码字符
+}
+
+
+/**
+ * 提取华为接口的媒体文件元数据
+ * @param filePath 文件路径(如:/data/storage/el1/base/test.mp3 )
+ * @returns Promise<FFMpegTags> 包含专辑、艺术家、标题的元数据对象
+ */
+export async function extractHwMediaMetadata(filePath: string): Promise<FFMpegTags> {
+  const tags: FFMpegTags = {};
 
+  if (!canIUse("SystemCapability.Multimedia.Media.AVMetadataExtractor")) {
+    console.warn("Metadata  extraction not supported on this device");
+    return tags;
+  }
+
+  try {
+    const avMetadataExtractor: media.AVMetadataExtractor = await media.createAVMetadataExtractor();
+    const fd = await fs.open(filePath,  fs.OpenMode.READ_ONLY);
+
+    // 设置文件描述符并提取元数据
+    avMetadataExtractor.fdSrc  = fd;
+    const metadata = await avMetadataExtractor.fetchMetadata();
+
+    // 映射标准FFMpeg标签
+    if (metadata) {
+      tags.album  = metadata.album  ?? undefined;
+      tags.artist  = metadata.artist  ?? metadata.author  ?? undefined; // 兼容不同元数据字段
+      tags.title  = metadata.title  ?? undefined;
+    }
+
+    // 关闭文件描述符
+    await fs.close(fd);
+    return tags;
+  } catch (error) {
+    const err = error as BusinessError;
+    console.error(`Metadata  extraction failed: ${err.code},  ${err.message}`);
+
+    return tags;
+  }
+
+  return tags;
+}