0.問題
-
經常要剪視頻,有時候自己講的希望能加個字幕,但是網上基本都是收費的,而且對於我這種做視頻沒什么收入的UP主來說有點貴了。所以一直在尋找一個便捷一點的或者說省錢一點的方法。
-
但是手機上發現有個軟件效果還不錯,每天免費30分鍾:
顯示是會員有30分鍾,會員就是注冊一下。
- 快剪輯快字幕功能操作流程如下
-
新建項目
-
選擇要生成字幕的視頻
-
選擇原始比例(可以隨便)
-
選擇一段要自動生成字幕的片段點生成
-
編輯調整字幕
其實到這里的話已經可以生成字幕達到目的了,但是快剪輯的字幕生成慢,而且不好剪輯,想導出到srt字幕文件到電腦上一起完成剪輯。
1.解決
- 在應用存儲文件夾下找到了這個文件
里面的內容,疑似json保存的項目工程文件
用JSON格式化工具看發現,字幕是在stickerlist屬性下的text屬性,開始和結束時間分別是startTime屬性和endTime屬性,時間是視頻開始到當前的毫秒數。
- 於是我利用這個文件,用Python寫了一個提取字幕的腳本
#!/usr/bin/python
# coding=UTF-8
import json
import time
import srt
from datetime import timedelta
def FlowlogToSrt(log):
#解析Json為字典
fldict = json.loads(log)
#獲取字幕列表
stickerlist = fldict['stickerlist']
#取出字幕
index = 0
subs = []
for sticker in stickerlist:
#序列號
index = index + 1
#開始時間
startTime = timedelta(milliseconds = sticker["startTime"])
#結束時間
endTime = timedelta(milliseconds = sticker["endTime"])
#內容
text = sticker["text"]
#轉成srt對象,並存入列表
subs.append(srt.Subtitle(index=index, start=startTime, end=endTime, content=text))
#轉成srt
srtText = ""
for sub in subs:
srtText = srtText + sub.to_srt()
print(srtText)
#寫入文件
filename = "KuaiJianJiSticker"+time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime())+".srt"
with open(filename, 'w', encoding="utf-8") as file_object:
file_object.write(srtText)
if __name__ == "__main__":
txt = input("請輸入手機快剪輯flowlog數據:(數據位於/Android/data/com.qihoo.qeditor/files/keyfiles/flowlog下)\n")
FlowlogToSrt(txt)
-
把那個文件上傳到電腦,輸入到代碼里
但是好像文件太大了,因為我的是35分鍾的會議,基本都有人在說話。 -
那只好提取出有用的部分咯
於是在JSON在線格式化這里格式化了一下代碼,把結果放到另外一個文件里。
用Java寫了以下代碼,用於提取出大致的JSON結構和所需要的部分屬性:
package clearJSON;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
//文件路徑
static String Path = "D:/eclipse-workspace/clearJSON/clearJSON/json.txt";
//結果緩存
static StringBuilder res = new StringBuilder();
public static void main(String[] args) throws IOException, InterruptedException {
//行數統計
int lineNumber = 0;
//讀取文件
FileInputStream fis=new FileInputStream(Path);
InputStreamReader isr=new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line = "";
while ((line=br.readLine())!=null) {
lineNumber++;
//結構保留
if(line.indexOf('{')!=-1 || line.indexOf('}')!=-1) {
add(line);
//保證添加的不是空對象
if((line=br.readLine())!=null) {
//結構里至少有一個屬性,添加以“{”開頭的下一行
add(line);
}
continue;
}
//屬性保留,需要的屬性可以以此類推添加到這里
if(line.indexOf("\"startTime\"")!=-1 || line.indexOf("\"text\"")!=-1 || line.indexOf("\"endTime\"")!=-1) {
add(line);
}
}
br.close();
fis.close();
//輸出結果
System.out.println("一共處理文件行數:"+lineNumber);
//輸出精簡后的JSON代碼
Thread.sleep(2000);
System.out.println(res.toString());
}
/**
* 添加文本到緩存里
* 完成對結構的判斷,依靠‘}’在第一個字符判斷是一組屬性的結尾,
* 然后刪除上一行行末的‘,’
* @param str 要添加的文字
*/
public static void add(String str) {
//判斷是不是一組屬性的結尾
if(str.trim().indexOf('}') == 0) {
//刪除上一行行末的逗號
res.deleteCharAt(res.length()-1);
}
//添加到緩存
res.append(str);
}
}
-
把JSON代碼精簡到了原來大小的8.6%:
-
之后再輸入到Python里。
成功生成SRT文件! -
導入到ARCTIME中:
成功導入到ARCTIME中!
2.總結
- 基本完成了需求,但是步驟有些麻煩。
- 今后可以嘗試合並Java和Python的部分。
- 寫這篇文章的原因主要還是沒錢。