馬蜂窩視頻編輯框架設計及在 iOS 端的業務實踐

来源:https://www.cnblogs.com/mfwtech/archive/2019/08/30/11434248.html
-Advertisement-
Play Games

(馬蜂窩技術公眾號原創內容,ID: mfwtech) 熟悉馬蜂窩的朋友一定知道,點擊馬蜂窩 App 首頁的發佈按鈕,會發現發佈的內容已經被簡化成「圖文」或者「視頻」。 長期以來,游記、問答、攻略等圖文形式的形態一直是馬蜂窩發展的優勢所在。將短視頻提升至與圖文併列的位置,是因為對於今天的移動互聯網用戶 ...


(馬蜂窩技術公眾號原創內容,ID: mfwtech)

熟悉馬蜂窩的朋友一定知道,點擊馬蜂窩 App 首頁的發佈按鈕,會發現發佈的內容已經被簡化成「圖文」或者「視頻」。

長期以來,游記、問答、攻略等圖文形式的形態一直是馬蜂窩發展的優勢所在。將短視頻提升至與圖文併列的位置,是因為對於今天的移動互聯網用戶來說,內容更真實直觀、信息密度更大、沉浸感更強的短視頻已經成為剛需。為了使旅游用戶擁有更好的內容交互體驗,豐富和完整原有的內容生態體系,馬蜂窩加碼了對短視頻領域的佈局。

現在,每天都會有大量短視頻在馬蜂窩產生,覆蓋美食、探店、景點打卡、住宿體驗等多種當地玩樂場景。馬蜂窩希望平臺的短視頻內容除了「好看」之外,更要「好用」。這個「好用」不僅僅是為有需求的用戶提供好用的旅行信息,更是指通過技術讓用戶的短視頻創作更加簡單易行。

為此,我們在馬蜂窩旅游 App 的視頻編輯功能中提供了「自定義編輯」與「模板創作」兩種編輯模式,使用戶既可以通過「模板」快速創作與模板視頻同款的炫酷視頻,也能夠進入「自定義編輯」模式發揮自己的創意,生成個性化視頻。

本文將圍繞馬蜂窩旅游 App iOS 端中的視頻編輯功能,和大家分享我們團隊視頻編輯框架的設計及業務實踐。

 

Part.1 需求分析

如前言所述,我們要做的是能夠支持「自定義編輯」與「模板創作」兩種模式的視頻編輯功能。

圖1:產品示意圖

 

首先我們梳理一下「自定義編輯」模式下,需要提供的功能:

  • 視頻拼接:將多段視頻按順序拼接成一段視頻

  • 播放圖片:將多張圖片合成一段視頻

  • 視頻裁剪:刪除視頻中某個時間段的內容

  • 視頻變速:調整視頻的播放速度

  • 背景音樂:添加背景音樂,可以與視頻原音做混音

  • 視頻倒播:視頻倒序播放

  • 轉場過渡:拼接的兩段視頻切換時增加一些過渡效果

  • 畫面編輯:畫面旋轉,畫布分區、設置背景色,增加濾鏡、貼紙、文字等附加信息

有了上述這些功能,便可以滿足「自定義編輯」模式的需求,能夠讓用戶通過我們的視頻編輯功能完成自己的創作。但是為了進一步降低視頻編輯功能的使用門檻,讓製作炫酷視頻變得簡單,我們還需要支持「模板創作」模式。即為用戶提供「模板視頻」,用戶只需要選擇視頻或者圖片,便可創作出與「模板視頻」有同樣編輯特效的同款視頻,實現「一鍵編輯」。

支持「模板創作」模式後,我們視頻編輯功能最終的流程圖如下:

圖2:完整流程圖

 

如圖所示,在媒體文件之外,多了一個模板 A 的輸入,模板 A 描述了要對用戶選擇的媒體文件做哪些編輯。同時在編輯器的輸出中多了一個模板 B,模板 B 描述了用戶在完成編輯後,最終做了哪些編輯。其中模板 B 的輸出,為我們解決了「模板視頻」來源的問題,即「模板視頻」既可以通過運營手段生產,也可以將用戶通過「自定義編輯」模式創作的視頻作為模板視頻,使其他用戶瀏覽該用戶發佈的視頻時,可以快速創作同款視頻。

通過上述需求分析的過程,可以總結出我們的視頻編輯功能主要支持兩個能力:

  1. 常規視頻編輯的能力

  2. 描述如何編輯的能力

這兩個能力的劃分,為我們接下來進行視頻編輯框架的設計提供了方向。

 

Part.2 框架設計

常規視頻編輯的能力是一個視頻編輯框架需要提供的基本能力,能夠支撐業務上的「自定義編輯」模式。「描述如何編輯」的能力則是將常規視頻編輯能力進行抽象建模,描述「對視頻做哪些編輯」這件事,然後將這種描述模型轉化為具體的視頻編輯功能,便能夠支撐起業務上的「模板創作」模式。所以我們的編輯框架可以劃分為兩個主要的模塊:

  • 編輯模塊

  • 描述模塊

在兩個模塊之間,還需要一個轉換模塊,完成視頻編輯模塊與描述模塊之間的雙向轉換。下圖為我們需要的視頻編輯框架示意圖:

圖3:視頻編輯框架示意圖

 

  • 編輯模塊所需要的具體功能,可以隨著業務上的需求不斷迭代添加,目前我們要支持的功能如圖中所列。

  • 描述模塊則需要一個描述模型,將媒體素材與各種編輯功能完整的描述出來。同時也需要將模型保存成文件,從而能夠被傳輸分發,我們稱之為描述文件。

  • 另外在描述文件的基礎上,「模板創作」模式中的「模板」還需要標題、封面圖等運營相關的信息。所以還需要提供一個運營加工的功能,能夠讓運營同事將描述文件加工為模板。

  • 轉換模塊負責的則是將視頻編輯功能抽象為描述文件、將描述文件解析為具體的編輯功能的任務,保證抽象與解析的正確性至關重要。

視頻編輯模塊在不同的開發平臺上都有很好的實現方案,比如 iOS 原生提供的 AVFoundation,使用廣泛的第三方開源庫 GPUImage,以及更加通用的 ffmpeg 等。具體的實現方案可以結合業務場景與項目規划進行選擇,我們目前在 iOS 端採用的方案是蘋果原生的 AVFoundation。如何結合 AVFoundation 實現我們的視頻編輯框架會在下文具體介紹。接下來我們就來看下具體功能模塊的設計與實現。

 

Part.3 模塊功能與實現

3.1 描述模塊

3.1.1 功能劃分

首先我們對「自定義編輯」模式下需要支持的具體功能進行分析,發現可以以編輯的對象為標準,將編輯功能劃分為兩類:段落編輯、畫面編輯。

  • 段落編輯:將視頻段看作編輯對象,不關心畫面內容,只在視頻段層面上進行編輯,包含如下功能:

圖4:段落編輯

 

  • 畫面編輯:將畫面內容作為編輯對象,包含如下功能:

圖5:畫面編輯

 

3.1.2 視頻編輯描述模型

有了編輯功能的劃分後,要描述「對視頻進行哪些編輯」,我們還需要一個視頻編輯描述模型。定義如下幾個概念:

  • 時間線:由時間點組成的單向遞增直線,起始點為 0 點

  • 軌道:以時間線為坐標系的容器,容器記憶體放的是每個時間點需要的內容素材及「畫面編輯」功能

  1. 軌道具有類型,一條軌道僅支持一種類型
  • 段落:軌道中的一段,即軌道所屬時間線上兩個時間點及兩點之間的部分
  1. 段落也具有類型,與其所屬軌道類型保持一致

軌道類型列表:

其中「視頻」、「圖片」、「音頻」類型軌道,是提供畫面與聲音內容的軌道。其餘幾個類型的軌道,則是用於描述具體做哪些畫面編輯功能的軌道。特效類型軌道中可以指定若幹畫面編輯效果,如旋轉、分區等。

結合編輯功能的劃分,我們可以看出段落編輯功能的編輯對象是軌道內的段落,畫面編輯功能的編輯對象是軌道記憶體放的內容素材。

有了時間線、軌道、段落三個概念以及段落編輯、畫面編輯兩個編輯行為的劃分後,我們在抽象層面描述視頻的編輯過程如下:

圖6:視頻編輯描述模型示意圖

 

如上圖所示,通過該模型,我們已經能夠完整的描述出「對視頻進行哪些編輯」:

  • 創作一個時長 60 秒的視頻,內容素材有視頻,圖片,音樂,分別對應軌道 1、軌道 2、軌道 3,並且有轉場、濾鏡效果,由軌道 4、軌道 5 指定(其他效果不再單獨描述,以轉場、濾鏡效果為參考)。

  • 該視頻由軌道 1 的 [0-20] 段、軌道 2 的 [15-35] 段、軌道 1 的 [30-50] 段以及軌道 2 的 [45-60] 段拼接而成。

  • [0-60] 視頻全段有背景音樂,音樂由軌道 3 指定。

  • [15-20]、[30-35]、[45-50] 三段內有轉場效果,轉場效果由軌道 4 指定。

  • [15-35] 段有濾鏡效果,濾鏡效果由軌道 5 指定。

3.1.3 描述文件與模板

有了上述的視頻編輯描述模型後,我們還需要具體的文件來存儲和分發該模型,即描述文件,我們使用 JSON 文件來實現。同時還需要提供運營加工的能力,使運營同事為描述文件添加一些運營信息,生成模板。

  • 描述文件: 根據視頻編輯模型生成一份 JSON 文件

舉個

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、Sqoop 基本命令 1. 查看所有命令 2. 查看某條命令的具體使用方法 二、Sqoop 與 MySQL 1. 查詢MySQL所有資料庫 通常用於 Sqoop 與 MySQL 連通測試: 2. 查詢指定資料庫中所有數據表 三、Sqoop 與 HDFS 3.1 MySQL數據導入到HDFS 1. ...
  • 一、Sqoop 簡介 Sqoop 是一個常用的數據遷移工具,主要用於在不同存儲系統之間實現數據的導入與導出: + 導入數據:從 MySQL,Oracle 等關係型資料庫中導入數據到 HDFS、Hive、HBase 等分散式文件存儲系統中; + 導出數據:從 分散式文件系統中導出數據到關係資料庫中。 ...
  • 筆者實驗環境:centos 7.4.1708,hadoop-2.6.0-cdh5.14.2. 執行hadoop命令時出現以下告警,不能載入相關庫: 檢查發現本地並沒有庫: 進入到hadoop目錄下可以看到/lib/native為空。 需要下載對應版本的庫文件:http://dl.bintray.co ...
  • 我們知道過去對於Kafka的定義是分散式,分區化的,帶備份機制的日誌提交服務。也就是一個分散式的消息隊列,這也是他最常見的用法。但是Kafka不止於此,打開最新的官網。 我們看到Kafka最新的定義是:Apache Kafka® is a distributed streaming platform ...
  • 五、限定查詢和排序顯示 5.1、限定查詢 5.1.1 認識限定查詢 例如 :如果一張表中有 100w 條數據,一旦執行了 “ SELECT FROM 表 ” 語句之後,則將在屏幕上顯示表中全部數據行的記錄,這樣既不方便瀏覽,也可能造成死機的問題,所以此時就必須對查詢的結果進行篩選,只選出對自己有用的 ...
  • 現象: MYSQL在安裝完成後,系統能正常運行,但是第二天出現瞭如下一個提示框,如下圖: 給個人人都看得懂的如下圖: 解決辦法: 這個是新版本MySQL服務自帶的一個定時任務,每天23:59:59執行的任務,我們只需要在本地系統的“任務計劃程式”中將這個定時任務幹掉就OK了。開始 -> 在 “ 搜索 ...
  • 有時候不用的指標的絕對值不能比,但是轉轉為百分比的形式就容易看出波動了,是數據分析的好用的一個分析函數20:00:24 SYS@orcl> conn scott/tiger;Connected.20:00:30 SCOTT@orcl> create table test20:01:22 2 (20:... ...
  • 如需轉載,請註明出處:Flutter學習筆記(25)--ListView實現上拉刷新下拉載入 前面我們有寫過ListView的使用:Flutter學習筆記(12)--列表組件,當列表的數據非常多時,需要使用長列表,比如淘寶後臺的訂單列表,手機通訊錄等,這些列表項數據很多,長列表也是使用ListVie ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...