ffmpeg-簡單AES加解密記錄
分享一下視訊分段快取技術之中的一種格式m3u8.據說是蘋果開發的,前途無量。
使用起來確實蠻方便,可以自己整合做成播放器。本文暫時只記錄簡單的加解密和播放。
觀摩這項技術時參考的幾篇文章分享如下:
使用ffmpeg轉碼m3u8並播放: https://blog.csdn.net/psh18513234633/article/details/79312607
hls協議(最清晰的講解):https://blog.csdn.net/weiyuefei/article/details/70257616
流媒體開發之--HLS--M3U8解析(2): HLS草案:https://blog.csdn.net/newarow/article/details/82805672
ffmpeg Cheatsheet: https://gist.github.com/larvata/95df619df7109d8b74d2b965a3266354#file-ffmpeg-cheatsheet-md
使用ffmpeg視訊切片並加密:https://www.cnblogs.com/codeAB/p/9184266.html
ffmpeg分解視訊檔案並加密:https://blog.csdn.net/cnhome/article/details/73250495
FFmpeg之ffplay命令使用:https://blog.csdn.net/xuyankuanrong/article/details/77529468
還有一些cmd操作:
CMD批處理迴圈,太強大了:https://blog.csdn.net/xhhjin/article/details/7373524
copy /b 命令無縫合並多個檔案:http://www.360doc.com/content/14/0212/22/9849466_352039289.shtml
當然還有其他很多參考過的網頁,但是都很散,有用資訊不多,暫不分享那些網頁。
這項技術運用在很多瀏覽器上,所以想找東西練手,還是蠻多的(某些想下載但是沒提示下載的視訊,實際上是放在快取資料夾裡面,然後本地load的)。
這裡我就簡單分享一下如何自己用ffmepg對一個視訊加密,以及解密該視訊。
目前我接觸到3種情況:
①未加密的視訊,用PotPlayer可以直接開啟觀看;
②有AES的key,沒IV(其實就是使用了預設值),部分有兩個m3u8;
③有AES的key和IV,就是下面將要分享的操作。
目前要使用的工具,首先必須要有ffmepg,下載成已經Build好的包,不然自己來生成比較麻煩,當然,有興趣可以下載程式碼來看,是開源的。
生成key部分我使用了Openssl,功能超級多,但是本文只用到簡單的生成隨機密碼。好像是我下載不對,操作發現不支援hex,所以後面生成hex部分得寫一下程式碼處理,當然也有網頁生成,資料庫生成,這裡就不寫明瞭。
然後就是準備一個視訊。我這次下載了這些東西:
接下來就開始動手:(實際不用Openssl也行,直接手動寫幾個編碼當密碼就行)
通過上面推薦的連結,大家應該知道是主要m3u8檔案,然後附帶的ts檔案(可以不寫字尾,就是些視訊片段,可以在播放器中開啟觀看),key(會改變視訊片段的編碼,導致無法播放)。
這裡的m3u8可以用播放器開啟,正常是會報錯的,因為視訊片段被AES加密了編碼模式,所以普通讀取出來不是正常的頭,就報錯了。
如果你遇到的m3u8沒有加密,那這裡是開啟可以播放的。上面那些ts也是可以直接播放器開啟的。
一般情況下,m3u8檔案可能需要進行修改。就是當你操作的是手機端,把快取搞在電腦上轉碼時(或者從C盤快取目錄拷貝出來時),裡面的路徑是不對的,裡面記錄的是絕對路徑,需要修改。像下面圖片,手機拷過來後是手機上的絕對路徑,用記事本ctrl + H,該成電腦上的當前路徑後就能用了(或者刪掉變成相對路徑)。
現在從頭開始做吧。
目前我們手上只有一個test.mp4,先介紹不加密的方式分段生成m3u8:
一.無加密方式生成m3u8
新建一個資料夾來放置後面要生成的ts檔案。
先用管理員身份執行cmd:
cd到ffmpeg.exe所在的地方(不過我推薦是cd到要生成檔案的地方,然後ffmpeg.exe弄成全路徑來執行,效率會高一些)。
例如我test.mp4在D:\aa\bb目錄下:
這樣我在cmd中輸入:
ffmpeg.exe -y -i D:\aa\bb\test.mp4 -hls_time 6 -hls_playlist_type vod -hls_segment_filename "D:\aa\bb\file%d" D:\aa\bb\playlist.m3u8
-hls_time 是每一段視訊多長時間
-hls_segment_filename 分段生成在哪裡,命名規則%d
以及結尾的m3u8輸出路徑
目錄下已經生成分段檔案+m3u8檔案了,由於這裡沒有加密,所以分段檔案可以用播放器直接開啟。當然也可以直接開啟m3u8檔案。
這裡插播一下ffplay的使用:
指令中要注意的就是路徑,從前面我們知道是m3u8中記錄是用相對路徑,所以需要把cmd移到該目錄下,然後用ffplay的全路徑 + -allowed_extensions ALL (就是允許全部字尾模式,否則沒後綴的不讓播放) +m3u8 + 回車
D:\aa\ffmpeg-4.0.2-win64-static\bin\ffplay.exe -allowed_extensions ALL playlist.m3u8
既然提到分段,那就有合併了。
由於這裡沒有使用加密,所以可以直接把全部ts檔案合併成一個檔案就行。
可以cmd直接合並,但是需要提前處理命名規則,因為cmd按字元比較的,01和1是兩種不同的概念,這裡可以寫個迴圈處理改命名,然後再 cmd的copy /b * new.mp4。
cmd程式碼不好寫。所以推薦還是用ffmpeg。
程式碼如下:合併並轉碼成mp4格式
D:\aa\ffmpeg-4.0.2-win64-static\bin\ffmpeg.exe -allowed_extensions ALL -i playlist.m3u8 -acodec copy -vcodec copy -f mp4 output.mp4
二.加密方式生成m3u8
有了前面那些截圖,這裡的操作其實就是多了寫密碼步驟而已,其他大部分一樣,所以這裡就不再截圖了。
加密,目前我看的是AES。概念那些大家有空去了解一下,這裡只分享一下怎麼用。
具體步驟是:使用ffmpeg視訊切片並加密
然後裡面一些引數,其實在原始檔裡面已經有了,可以找這些文件來弄明白設定什麼引數:
這裡我多分享一下直接用一個key來加密怎麼操作吧。就是手上有一個密碼+一個視訊,弄到最後是一個放密碼的文字檔案,然後就是ts+m3u8,沒有IV。
其實就是前面步驟中,enc.keyinfo中第三行的IV刪掉就行。
同時步驟一中用openssl生成key的,改成:新建文字檔案,寫入密碼後儲存,然後刪掉字尾當key。
其他照舊:
D:\aa\ffmpeg-4.0.2-win64-static\bin\ffmpeg.exe -y -i test.mp4 -hls_time 6 -hls_key_info_file k0.keyinfo -hls_playlist_type vod -hls_segment_filename "file%d" playlist.m3u8
密碼檔案k0,用openssl生成的話,開啟是亂碼的,自己寫入的就不會亂碼,使用起來暫時未發現區別:
加密方式生成的ts檔案,你會發現無法用播放器開啟,只能用ffplay開啟(開啟方式同無加密一樣的程式碼,都是直接傳入m3u8檔案即可)。
這樣解密方式,實際也和前面一樣,都是圍繞m3u8,是否有key,實際都是內部處理的。
這裡可能會遇到問題的是,網上的都是說EXT-X-KEY這裡的是http,實際都可以,找得到檔案就行。然後就是開頭提的兩個m3u8的,這個就溜一點:
改EXT-X-KEY的檔案地址為key的本地地址後,發現這樣去轉是失敗的(提示找不到ts檔案),這時可以把下面的一堆ts資訊,換成另一個m3u8裡面的ts資訊,就可以轉換了。我遇到的情況,是第一個ts資訊是本地檔案,第二個是一個找不到的路徑的檔案(但是這個帶key,第一個不帶),修改成本地檔案後,除了#EXTINF的數字不同外,其他都一樣(檔案也能找到了),結果還是報錯,就把那個m3u8的ts資訊都複製過來(#EXTINF的數字保持一樣),本個m3u8只保留EXT-X-KEY這裡的URI="k0",其他都是用另一個m3u8的,就可以轉換了。
---------------------
作者:Yao_PC
來源:CSDN
原文:https://blog.csdn.net/Yao_2333/article/details/82910560?utm_source=copy
版權宣告:本文為博主原創文章,轉載請附上博文連結!