1:ffmepg進行打水印解密
前提ffmepg安裝利用靜態版就可以這個什么都有,不用再配置其他信息:(這個利用ffmpeg終端命令是沒問題的,但是如果要是再C++中調用ffmpeg庫那么還需要從新編譯安裝下)
各個版本
Index of /ffmpeg/old-releases
1.1 獲取水印的列表
def get_json2txt(jsonpath):with open(jsonpath,'r',encoding='utf8')as fp: datajson = json.load(fp)list_json = datajson["heart_beats"]watermark_texts =["none"]*20for i in range(len(list_json)):# text =[]train_id = "車號 "+list_json[i]['train_id']task_number = "車次 "+list_json[i]['task_number']speed = "速度 "+str(list_json[i]['speed'])K_NUM = int(list_json[i]['mileage'])//1000LEF_NUM = int(list_json[i]['mileage'])%1000mileage = "位置 "+f'K{K_NUM}+{LEF_NUM}'timetimestamp = int(list_json[i]['capturedAt'])dtime=dt.datetime.fromtimestamp(timetimestamp,tz=dt.timezone(dt.timedelta(hours=8)))formatted_time= "時間 "+ dtime.strftime("%Y-%m-%d %H-%M-%S")text= train_id +'\n' + task_number +'\n' + str(speed) +'\n' + mileage +'\n' + formatted_timewatermark_texts[i]=text# print(text)return watermark_texts
1.2 將水印列表打印到視頻上
def create_dynamic_watermark_stable(input_video, output_video, text_list,key):"""更穩定的動態水印實現方案使用時間表達式來模擬列表索引變化"""# 構建包含多個drawtext濾鏡的命令filters = []for i, text in enumerate(text_list):# 每個文本顯示1秒start_time = iend_time = i + 1filters.append(f"drawtext=text='{text}':fontcolor=white:fontsize=40:box=1:boxcolor=black@0.5:boxborderw=5:x=10:y=10:enable='between(t\\,{start_time}\\,{end_time})'")filter_str = ",".join(filters)cmd = ['/home/administrator/workspace/SJPTFF/ffmpeg-4.4.1-amd64-static/ffmpeg','-decryption_key',key,#這個是解密用'-i', input_video,'-vf', filter_str,'-c:a', 'copy',# '-c:v', 'copy','-y',output_video,]try:result = subprocess.run(cmd, capture_output=True, text=True)if result.returncode == 0:logger_ffmpeg.info(f"成功生成帶動態水印的視頻: {output_video}")else:logger_ffmpeg.error(f"處理視頻時出錯: {result.stderr}")except Exception as e:logger_ffmpeg.error(f"發生錯誤: {e}")
2 ffmpeg進行合并
def concat_videos_subprocess(self,concatvideo,videoslist,flag=0):'''絕對路徑,list內也包含絕對路徑'''concat_videospath = os.path.dirname(concatvideo)concat_videos_path = os.path.join(os.path.dirname(concat_videospath),'videos_de')concat_list_txt = os.path.join(concat_videospath,'concat_list.txt')with open(concat_list_txt,"w") as f:# if flag:# f.write(f"file '{concatvideo}' \n")for videos_path_index in range(len(videoslist)):videos_abspath = os.path.join(concat_videos_path,videoslist[videos_path_index][1])f.write(f"file '{videos_abspath}' \n")self.update_mile_time(videoslist,os.path.dirname(concat_videospath))output_path = concatvideo.rstrip('.mp4')+'temp.mp4'cmd = ['ffmpeg','-f','concat','-y','-safe','0','-i',concat_list_txt,'-c','copy',output_path]subprocess.run(cmd,check=True)os.system(f'cp {output_path} {concatvideo}')
3 ffmpeg 進行推流
3.1 部署srs服務
SRS (Simple Realtime Server) 是一個用 C++ 編寫的開源流媒體服務器,支持 RTMP、WebRTC、HLS、HTTP-FLV、SRT、GB28181 等多種協議。它設計簡潔、性能高、易于部署,適合構建低延遲、高并發的實時音視頻系統。
GitHub 項目地址:https://github.com/ossrs/srs
3.2 ffmpeg推流