背景

  • DJI无人机(如Phantom、Mavic、Spark或Inspire)在视频录制过程中意外关机可能导致视频文件损坏,无法播放。
  • 用户手册建议:将Micro-SD卡放回相机,重启相机并等待约30秒以恢复视频文件。此方法有时有效,但有时文件仍损坏。

损坏文件类型

  1. MP4格式损坏文件:文件开始有'ftyp'和'moov'原子,后跟'mdat'原子,但'mdat'包含新的'ftyp'、'moov'和'mdat'原子,形成有效的MP4视频文件。可通过跳过初始原子和'mdat'头部来修复。
  2. 原始H.264 NAL单元文件:文件不包含MP4格式数据,仅包含以4字节大小字段引导的原始H.264 NAL单元序列。修复后为".h264"格式,可能需要特定播放器播放。
  3. 尾部损坏的MP4文件:文件开始正常,但尾部数据可能不正确,导致文件未正确“完成”。修复后同样为".h264"格式。

免费修复工具

下载djifix

  • Mac OS X
    • 下载"djifix"。
    • 打开"Terminal",使用命令 chmod +x djifix./djifix 文件名运行程序。
  • Windows
    • 下载"djifix.exe",移动到待修复文件同一文件夹。
    • 打开"Cmd",使用命令djifix 文件名运行程序。

常见问题解答(FAQ)

  • 修复视频可能丢失最后几秒,特别是突然断电时。
  • 修复文件后,如果文件以".h264"结尾,可能需要特定播放器播放。
  • 如果修复文件无法播放,尝试重新运行"djifix",选择不同的视频格式代码。
  • ".h264"文件可使用"ffmpeg"或"MiroVideoConverter"转换为".mp4"。

其他注意事项

  • 如果视频文件很小(小于10MB),可能只包含极短的视频片段,修复价值不大。

命令示例

  • 在Mac上运行:cd Movieschmod +x djifix./djifix
  • 编译源代码:cc -O -o djifix djifix.c
  • 使用ffmpeg转换:ffmpeg -i DJI_XYZW-repaired.h264 -c copy DJI_XYZW-repaired.mp4

目前最简单的方法是通过microG这个项目,然后就可以安装 Google Play Store 或者用aurora store 替代

如果你只是为了安装facebook,google play,google map,正常收到消息通知,不使用googlepay等服务,那么microG这个方案是非常完美!

先介绍一下 microG Project 这个项目

MicroG 项目是一个开源项目,旨在重新实现 Google 在 Android 系统中的专有应用程序和库,以支持自由软件社区的需求。简单来说,它的作用可以概括为以下几点:

  1. 自由软件支持:由于 Android 核心操作系统虽然是开源的,但很多核心应用和库并不是,MicroG 项目提供了一个自由软件版本的 Google 核心库和应用,使得用户可以不依赖 Google 的专有服务。
  2. 隐私保护:MicroG 允许用户减少或监控发送到 Google 的数据,这对于注重隐私的用户来说是一个重要的优点。
  3. 兼容性扩展:一些流行的开源应用程序需要 Google 的专有库才能运行,MicroG 项目通过提供这些库的自由软件版本,扩展了这些应用程序的兼容性。
  4. 老旧设备优化:对于老旧的 Android 设备,使用 MicroG 可以提高电池续航,因为它们不需要运行 Google 的全套服务。
  5. 测试和虚拟基础设施:MicroG 不仅可以在真实设备上使用,还可以在测试模拟器中替代 Google 工具,甚至用于虚拟移动基础设施

microG 提供了以下组件:

  1. Service Core (GmsCore):一个库应用,提供运行依赖于 Google Play 服务或 Google Maps API 的应用所需的功能。
  2. Services Framework Proxy (GsfProxy):一个小工具,允许使用 Google Cloud Messaging 服务的应用正常运行。
  3. Unified Network Location Provider (UnifiedNlp):一个库,提供基于 Wi-Fi 和蜂窝塔的地理定位服务。
  4. Maps API (mapsv1):一个系统库,提供与已弃用的 Google Maps API (v1) 相同的功能。
  5. Store (Phonesky):一个前端应用,提供访问 Google Play 商店的功能,目前还在早期开发阶段。

microG官网下载 Download - microG Project

这次用于鸿蒙系统的只需要下载:

1、microG Services
microg/GmsCore (com.google.android.gms-*-hw.apk)

也可以不安装 Play 用 aurora store 替代,但有些App会检测 Play 是否安装,这时候就需要安装 microG Companion 这个来欺骗这些 App

2、microG Companion
microg/GmsCore (com.android.vending-*-hw.apk)

注意都是下载 hw 结尾的文件,* 号代表不同版本,下载最新即可
华为的应用市场也可以搜索到,用名字直接搜索即可

3、应用商店
google play sotre 这个自行找,我是在这里下载 apkmirror

aurora store Aurora 官网下载

microG Services 安装后没有图标,需要在应用管理里面找到后点击右上角齿轮才可以进去

刚安装完后就会弹出设置界面,进去“自我检查” 一个个勾上,然后点击 “Google 账号” 登录自己账号
2024-05-25T15:50:00.png

最近练听力,找到 englishpod 的 mp3,非常不错,但是缺少同步字幕,所以用openai的whisper来转换
但是官方的 whisper 每次只处理30s,需要分片处理,所以找到了 Whisper Jax 声称速度更快,而且不需要自己处理分片的问题。

import jax
import jax.numpy as jnp
import os
import time
import json
import magic
from whisper_jax import FlaxWhisperPipline

def get_mp3_files(directory):
    total_files = 0
    print(f"scanning files...")
    for root, dirs, files in os.walk(directory):
        for file in files:
            mime = magic.Magic(mime=True)
            if mime.from_file(os.path.join(root, file)) == 'audio/mpeg':
                total_files += 1
                yield os.path.join(root, file)
    print(f"Total files: {total_files}")

def mp3_to_text(directory):
    pipeline = FlaxWhisperPipline("openai/whisper-large-v2", dtype=jnp.bfloat16)
    for mp3_file in get_mp3_files(directory):
        print(f"Processing file: {mp3_file}")

        txt_file = os.path.splitext(mp3_file)[0] + '.txt'
        if os.path.isfile(txt_file):
            print(f"Skipping file: {mp3_file}")
            continue

        start_time = time.time()
        text = pipeline(mp3_file, task="translate", language="chinese",return_timestamps=True)
        text_length = len(text['text'])  # 获取转录文本的长度
        print(f"Text length: {text_length} characters")
        end_time = time.time()
        print(f"Processed in {end_time - start_time} seconds")

        with open(txt_file, 'w') as f:
            f.write(json.dumps(text))


start_time = time.time()
mp3_to_text('/data/englishpod')
end_time = time.time()
print(f"Total time: {end_time - start_time} seconds")

使用这个工具
https://github.com/vzhd1701/evernote-backup

备份步骤1
如果是印象笔记要注意的是需要加入 --backend china 参数

./evernote-backup.exe init-db --backend china
Logging in to Evernote...
Username or Email: king@gmail.com
Password:
Enter one-time code (+XX XXX XXXX 2010): 638303
Authorizing auth token, china backend...
Successfully authenticated as king!
Current login will expire at 2024-07-09 07:31:21.
Initializing database en_backup.db...
Reading database en_backup.db...
Successfully initialized database for king!

备份步骤2

./evernote-backup.exe sync
Reading database en_backup.db...
Authorizing auth token, china backend...
Successfully authenticated as king!
Current login will expire at 2024-07-09 07:31:21.
Syncing user notebooks...
  [####################################]  60931/60931
2267 note(s) to download...
Downloading 2267 note(s)...
  [####################################]  2267/2267
Updated or added notebooks: 96
Updated or added notes: 2267
Expunged notebooks: 38
Expunged linked notebooks: 0
Expunged notes: 660
Synchronization completed!

备份步骤3

./evernote-backup.exe export ./
Reading database en_backup.db...
Exporting notes...
  [####################################]  96/96
All notes have been exported!

GPT输入和输出的长度都是有限制的,OPENAI的GPT4是8K,azure的是32K

这个长度限制要注意是指 输入的 prompt + 模型返回的。

调用接口的时候为了更准确的拆分长文本,需要计算token数量,但是不同版本的GPT用的编码方式不一样,所以计算token数量的方式也是不一样的。官方有python的库可以用,但其它语言的就需要找到合适的。

不同版本用的编码方式不一样:
cl100k_base:gpt-4, gpt-3.5-turbo, text-embedding-ada-002
p50k_base:Codex models, text-davinci-002, text-davinci-003
r50k_base (or gpt2):GPT-3 models like davinci

官方GPT-3的在线计算工具
https://platform.openai.com/tokenizer
Tiktokenizer 在线工具
https://tiktokenizer.vercel.app/

gpt-tokenizer 截图,点击这里访问
gpt-tokenizer

支持cl100k_base and p50k_base 编码的库(也就是GPT-4和GPT-3.5)
Javascript:
https://github.com/niieani/gpt-tokenizer
https://www.npmjs.com/package/gpt-tokenizer

Python
https://github.com/openai/tiktoken

Java
https://github.com/knuddelsgmbh/jtokkit

.NET/C#
https://github.com/dmitry-brazhenko/SharpToken
https://github.com/aiqinxuancai/TiktokenSharp