生活随笔
收集整理的這篇文章主要介紹了
                                
一个优秀活跃的视频转码项目分享
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
 
                                
                            
                            
                            序
 今天分享一個視頻轉碼的項目。起因是另一個team渝澳了攝像頭視頻流的播放問題,自從瀏覽器放棄flash支持后,好多視頻格式都不能播放了,于是視頻轉碼就必不可少了。然而很多公司并沒有精力、資金去對這塊過多的投入,一時間無論是前端播放器插件、還是后端轉碼項目,都特別火。今天主要是分享下發現的后端轉碼項目-EasyMedia,這其實也是另一個team哥們發現的,我這里研究下作為技術儲備。
 一、項目說明
 這個項目是開源的,而且作者說可以任意商用,當然這是暫時的。但是,里面引入了javacv、ffmpeg,這2塊的LICENSE是GPL協議,所以只要不對這2塊坐修改,商用是ok的。
 項目的活躍度還很高,最近一次代碼提交時1個月前。更新了部分依賴,引入了數據庫H2,當然這塊我們要用肯定是要坐二開的。
 Springboot、netty實現的http-flv、websocket-flv流媒體服務(可用于直播點播),支持rtsp、h264、h265等、rtmp等多種源,h5純js播放(不依賴flash),不需要依賴nginx等第三方,延遲大部分在1-5秒內(已經支持轉復用,h264的流自動轉封裝,超低延遲。PS:當然還有種更低延遲的不用flv方案沒時間寫了,但是主要是flv比較大眾,這個一般也夠用了)。
 二、項目技術架構
 軟件架構
 
- netty負責播放地址解析及視頻傳輸,通過javacv推拉流存到內存里,直接通過輸出到前端播放
- 后端:springboot、netty,集成websocket
- 前端:vue、html5(簡單的管理頁面)
- 播放器:西瓜播放器
 http://h5player.bytedance.com/
 (字節跳動家的,不介紹了,抖音視頻、西瓜視頻都杠杠的,當然只要支持flv的播放器都可以)
- 媒體框架:javacv、ffmpeg
 功能匯總
- 支持播放 rtsp、rtmp、http、文件等流……
- pc端桌面投影
- 支持永久播放、按需播放(無人觀看自動斷開)
- 自動判斷流格式h264、h265,自動轉封裝
- 支持http、ws協議的flv
- 支持hls內存切片(不占用本地磁盤,只占用網絡資源)
- 重連功能
- 支持javacv、ffmpeg方式切換
 三、代碼下載升級與親測
 下載地址我就不貼了,博友可以自己搜索。
 代碼下載后基本沒有什么錯誤,調整下JDK版本、maven編譯環境就ok了,唯一就是代碼格式有點凌亂,注釋偏少。但是總體來說還是寫的很清楚的,個人認為1年+經驗的秒看懂。
 依賴升級內容:(我本人習慣整新)
 1、spring-boot升級2.5.4
 2、javacv升級1.5.6
 3、ffmpeg-platform升級4.4-1.5.6,與javacv對應
 4、hutool-all升級5.7.10
 5、netty-all升級4.1.67.Final
 整體pom如下:
<?xml version
="1.0" encoding
="UTF-8"?>
<project xmlns
="http://maven.apache.org/POM/4.0.0"xmlns
:xsi
="http://www.w3.org/2001/XMLSchema-instance"xsi
:schemaLocation
="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion
><parent><groupId>org
.springframework
.boot
</groupId
><artifactId>spring
-boot
-starter
-parent
</artifactId
><version>2.5.4</version
><relativePath
/> <!-- lookup parent from repository 
--></parent
><groupId>com
.zj
</groupId
><artifactId>EasyMedia</artifactId
><version>1.2.0</version
><name>EasyMedia</name
><description>一款簡單的流媒體服務
</description
><properties><java.version>1.8</java
.version
><skipTests>true</skipTests
></properties
><dependencies><dependency><groupId>org
.springframework
.boot
</groupId
><artifactId>spring
-boot
-starter
-web
</artifactId
></dependency
><dependency><groupId>org
.springframework
.boot
</groupId
><artifactId>spring
-boot
-devtools
</artifactId
><optional>true</optional
></dependency
><dependency><groupId>org
.projectlombok
</groupId
><artifactId>lombok
</artifactId
><optional>true</optional
></dependency
><dependency><groupId>org
.springframework
.boot
</groupId
><artifactId>spring
-boot
-starter
-test
</artifactId
><scope>test
</scope
><exclusions><exclusion><groupId>org
.junit
.vintage
</groupId
><artifactId>junit
-vintage
-engine
</artifactId
></exclusion
></exclusions
></dependency
><!-- 全量引入 ,包含ffmpeg、opencv等 
--><!-- <dependency> <groupId>org
.bytedeco
</groupId
> <artifactId>javacv
-platform
</artifactId
><version>1.5.5</version
> </dependency
> --><!-- 媒體只用到以下兩個 
--><dependency><groupId>org
.bytedeco
</groupId
><artifactId>javacv
</artifactId
><version>1.5.6</version
></dependency
><dependency><groupId>org
.bytedeco
</groupId
><artifactId>ffmpeg
-platform
</artifactId
><version>4.4-1.5.6</version
></dependency
><!-- 工具包 
--><dependency><groupId>cn
.hutool
</groupId
><artifactId>hutool
-all
</artifactId
><version>5.7.10</version
></dependency
><!-- netty 
--><dependency><groupId>io
.netty
</groupId
><artifactId>netty
-all
</artifactId
><version>4.1.67.Final
</version
></dependency
><!-- h2驅動 
--><dependency><groupId>com
.h2database
</groupId
><artifactId>h2
</artifactId
><scope>runtime
</scope
></dependency
><!-- jpa 
--><dependency><groupId>org
.springframework
.boot
</groupId
><artifactId>spring
-boot
-starter
-data
-jpa
</artifactId
></dependency
><!-- mybatisplus 
--><dependency><groupId>com
.baomidou
</groupId
><artifactId>mybatis
-plus
-boot
-starter
</artifactId
><version>3.4.3.2</version
></dependency
><!-- 云臺控制sdk需要 
--><dependency><groupId>com
.jna
</groupId
><artifactId>jna
</artifactId
><version>1.0.0</version
><scope>system
</scope
><systemPath>$
{project
.basedir
}/sdk
/jna
.jar
</systemPath
></dependency
><dependency><groupId>com
.examples
</groupId
><artifactId>examples
</artifactId
><version>1.0.0</version
><scope>system
</scope
><systemPath>$
{project
.basedir
}/sdk
/examples
.jar
</systemPath
></dependency
></dependencies
><build><plugins><plugin><groupId>org
.springframework
.boot
</groupId
><artifactId>spring
-boot
-maven
-plugin
</artifactId
><version>2.5.4</version
><configuration><includeSystemScope>true</includeSystemScope
></configuration
></plugin
></plugins
></build
></project
> 
注意首次編譯跳過test,這里我增加了跳過配置:true
 四、運行效果
 console:
 
 界面效果
 
 Flv拉流播放效果
 
 如果可以看到這個界面,那就說明沒有問題了。但是注意前提是在流配置界面配置的流地址本生就是可播放的哦(可以用vlc播放器打開網絡串流驗證)。
 按照示例直接拼的地址如:
 http://172.16.2.39:8866/live?url=rtsp://admin:密碼@xx.xx.xx.xx:30410/Streaming/Channels/101
 可以直接在360瀏覽器打開,目前360瀏覽器直接打開這種流地址,是可以直接播放的。
 五、總結
 這個驗證沒有問題就可以集成到自己的項目了,集成方式2種:
 1、直接搭建使用,修改數據庫的使用就ok了。
 2、只要能力,不要業務。比如就只提供要轉碼的url,出參為可播放的url,然后地址怎么用就看業務了
 最后,說下,這樣我們就不用自己搭建ffmpeg轉碼服務,專注業務就可以了。不過這種轉碼是比較吃資源的,然后設備的原流地址可能多了就推不動,不過這里面好像有復用邏輯,也就是說轉碼url一樣可能就共用的同一個轉出流,詳細情況還要去看看源碼。就寫到這里,希望可以幫到大家。
                            總結
                            
                                以上是生活随笔為你收集整理的一个优秀活跃的视频转码项目分享的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。