前言:本文參考了其他已有的文章,在其基礎上簡化了一些沒有必要的操作。
同時也記錄一下chrome 插件ppapi環境的基礎搭建。並且感謝已有文章作者的大無畏的分享精神!
在這附上參考文章鏈接:https://blog.csdn.net/y601500359/article/details/72821974
當前系統版本為 Windows 10 x64, Chrome 版本 71.0.3578.98(正式版本) (32 位),VS2013(中文版)
==============================================================================
如果你能下載到NACL SDK pepper_47 或者 pepper_49 的話下面的一些操作可以省略,直接從步驟4開始看起!(僅限編譯運行media_stream_vide)
----------------------------------------------------------------
1.)下載 "假"nacl_sdk (此操作可以省略)
先下載並安裝 Python 因為更新的時候需要。
https://www.python.org/download/
* 必須使用 Python 2.7 版本
這個步驟主要是為了更新真的NACL SDK 改步驟全程需要翻牆。(不翻牆可以從別處下載一個下來很小大概38kb左右)
解壓nacl_sdk 之后進入其目錄下 shift +右鍵 選擇啟動命令行:
2.)更新真 NACL SDK (此操作可以省略)
步驟2全程需要翻牆更新 。在更新之前可以通過 list命令查看版本信息:
./naclsdk.bat list
post_stable:前一個穩定版本
stable:穩定版,推薦追求穩定的普通用戶使用,更新最慢。
beta:測試版,有一定新功能,但是可能會存在不穩定情況,適合喜歡嘗鮮的朋友使用,更新速度一般。
dev:開發版,更新最快,新功能最多,但是可能非常不穩定,適合開發人員使用。
此處我使用的是pepper_47 版本。
然后使用更新命令:./naclsdk.bat update
可能會出現如下錯誤:
出現的原因 原作者說是 證書cacerts.txt 的問題。解決方案可以從原作者提供的下載連接進行下載然后替換nacl_sdk下面的這個文件(可能需要多次替換)
原作者提供的證書文件下載連接:https://download.csdn.net/download/y601500359/10442560 (再次感謝原作者的分享)
如果沒有什么問題正常應該是 會把pepper_49版本更新下來。如果想更新其他的版本可以使用下面的命令:
./naclsdk.bat update pepper_47
更新完成之后 真的sdk 就下載下來了如下:
3.)安裝 vs_addin (此操作可以不做)
按照原作者的教程 是使用命令:naclsdk update sdk_addin
我做這個操作的時候沒有正常更新下來,猜測可能是因為 vs_addin 的命名有更新
我是直接從別的地方直接下載 vs_addin (如果需要支持vs2013需要修改其install.py和create_ppapi_platform.py文件這里不做描述)
然后進vs_addin 目錄執行安裝命令:
install.bat (vs2010或者vs2013需要有英文語言包 因為再install 的時候會需要1033的語言包 這些再網上都可以下載到)
如果下載的語言安裝包如果安裝失敗的話,可以把該安裝包新建一個桌面快捷方式 然后點擊快捷方式右鍵選:屬性-目標 然后再路徑后面加上: -Uninstall
完整如下:D:\other\vs2013.exe -Uninstall
就可以正常安裝英文語言包了。
這一步驟完全可以省略不去做因為,安裝不安裝vs_addin 也不影響正常ppapi開發!!!
4.)設置Chrome 瀏覽器環境路徑和開啟nacl
首先需要本機安裝chrome 瀏覽器 默認情況下 其絕對路徑應該為:C:\Users\Admin\AppData\Local\Google\Chrome\Application\chrome.exe
再系統環境變量 path 后面加上:C:\Users\Admin\AppData\Local\Google\Chrome\Application
其次開啟chrome 瀏覽器nacl 相關模塊:
打開chrome 瀏覽器 地址欄輸入: chrome://flags/
開啟之后按F12 選一下 network 里邊的Disable cache
然后重啟瀏覽器 地址欄輸入:chrome://nacl 檢測一下是否正常開啟。
5.)編譯NACL SDK 自帶 Demo:pepper_47\examples\api\media_stream_video
1.打開vs2013 新建win32 項目起名:media_stream_video 然后選擇DLL 完成創建。
2.刪除自動生成那些.h .cpp 文件。
3.拷貝nacl sdk目錄下的dmeo:pepper_47\examples\api\media_stream_video 下的 media_stream_video.cc 文件到新建的win32項目目錄下並且添加到項目當中。
4.再新建的win32項目的目錄下新建兩個文件夾:include 和 lib
5.拷貝nacl sdk 下的include 和lib文件到步驟4新建include 和 lib目錄下(具體拷貝pepper_47/include 目錄下的所有文件。拷貝pepper_47/lib/win_x86_32_host/release 目錄下的所有lib文件)。
6.回到win32程序中選擇 release 模式然后 取消預編譯頭 並且設置:在“配置屬性–>C/C++–>代碼生成–>運行庫”中設置為MT
7.設置項目依賴include目錄:“配置屬性--》C/C++>>常規-》附加包含目錄”中增加:./include
8.設置項目以來lib目錄:“配置屬性--》連接器>>常規-》附加庫包含目錄”中 增加: ./lib
9.加入項目依賴具體lib:“配置屬性--》連接器>>輸入-》附加依賴項”中 增加:
ppapi.lib
ppapi_cpp.lib
ppapi_gles2.lib
如下:
10.直接編譯生成 media_stream_video.dll 會再項目Release目錄下。
11.拷貝nacl sdk :pepper_47/examples/api/media_stream_video/index.html 文件到剛才生成Release目錄下修改html內容參考如下:
!DOCTYPE html> <html> <!-- Copyright 2014 The Chromium Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> <head> <title>Media Stream Video Example</title> <script type="text/javascript"> var plugin; var stream; function handleMessage(message) { console.log(message); } function success(s) { stream = s; plugin.postMessage({ command: 'init', track: stream.getVideoTracks()[0] }); } function failure(e) { console.log(e); } function initialize() { plugin = document.getElementById('plugin'); plugin.addEventListener('message', handleMessage, false); var constraints = { audio: false, video: { mandatory: { minWidth: 640, minHeight: 320, minFrameRate: 30 }, optional: [] } }; navigator.webkitGetUserMedia(constraints, success, failure); } function changeFormat(format) { plugin.postMessage({ command: 'format', format: format }); } function changeSize(width, height) { plugin.postMessage({ command: 'size', width: width, height: height }); } document.addEventListener('DOMContentLoaded', initialize, false); </script> </head> <body> <h1>Pepper MediaStream Video API Example</h1><br> This example demonstrates receiving frames from a video MediaStreamTrack and rendering them in a plugin.<br> Left side shows YUV frames. Right side shows BGRA frames. <embed id="plugin" type="application/x-ppapi-example-media-stream-video" width="640" height="240" /> <h2>Format:</h2><br> <button onclick=" changeFormat('YV12')">YV12</button> <button onclick=" changeFormat('I420')">I420</button> <button onclick=" changeFormat('BGRA')">BGRA</button> <button onclick=" changeFormat('DEFAULT')">DEFAULT</button> <h2>Size:</h2><br> <button onclick=" changeSize(72, 72)">72 x 72</button> <button onclick=" changeSize(640, 360)">640 x 360</button> <button onclick=" changeSize(1280, 720)">1280 x 720</button> <button onclick=" changeSize(0, 0)">DEFAULT</button> </body> </html>
其中 PostMessage(message) 用於向 C++ 端發送消息,HandleMessage 用於接收來自 C++ 端的消息。
12.為了方便測試該DLL 我是直接拷貝該Release 整個目錄到 D盤根目錄下的“1”文件夾中。
13.管理員身份開啟命令行 輸入命令行參數:
chrome --register-pepper-plugins="D:/1/Release/media_stream_video.dll#ppexample##1.0.0;application/x-ppapi-example-media-stream-video" file:///D:/1/Release/index.html
--register-pepper-plugins 參數表示注冊 PPAPI 插件,其中 application/x-ppapi-hello 為插件類型,注意這個類型名要和 HTML 中指定的 embed 元素的類型名要完全匹配!
正常就可以開啟攝像頭了
===========================================================================================================
補充:如果你執行的時候頁面提示:”該插件不受支持“ 這個時候你需要把所有開啟的chrme 瀏覽器關閉掉然后再執行 剛才的命令就可以正常加載DLL了
再次補充:上面的一些步驟可以省略的還有不需要操作的。是因為只需要把真正的NACL SDK 搞到就行,然后只需要其里邊的 include 文件 和lib文件 。
vs_addin 也不用安裝。編譯的時候直接 再項目中新建include和lib 目錄作為依賴就可以正常編譯ppapi插件了。記得編譯的時候要選release模式 因為debug模式下可能會編譯出錯。
-----------------------------------------
備注:如果執行上面的命令行想看到 程序內部的 OutputDebugString 輸出 需要關閉chrome 沙箱
命令行:chrome -no-sandbox --register-pepper-plugins="D:/1/Release/media_stream_video.dll#ppexample##1.0.0;application/x-ppapi-example-media-stream-video" file:///D:/1/Release/media_stream_video.html