gpt4 book ai didi

android - 在 React-Native 中使用 base64 编码的字符串播放视频

转载 作者:技术小花猫 更新时间:2023-10-29 12:54:20 26 4
gpt4 key购买 nike

我使用 base64 编码格式和 AES 加密法对视频文件进行了加密。我逐流解密数据并追加/写入每个流(作为 .mp4 文件)以实现最终视频,但实现最终输出需要花费大量时间。

主要修改:

我找到了资源html5-media-and-data-uri这有助于在 webview 中播放数据,但它不能播放包含 2,000,000+ base64 字符的视频。

Function to decrypt a file and initialize HTML code within web view with base64 data

decryptfile() {
RNFetchBlob.fs
.readStream(
RNFetchBlob.fs.dirs.DCIMDir + "/encryptfile1.dat",
"base64",
2796256, //character to be read at a time for decryption
2500 // Time taken before each stream enters for decryption
)
.then(stream => {
let data = "";
stream.open();
stream.onData(chunk => {
var decipherText = simpleCrypto.decrypt(chunk.toString()); // Decryption
decryptText = decryptText + decipherText; // appending decrypted data
});
stream.onEnd(() => {
htmlCode =
`<html>
<body>
<video style="width: 50%; height: 50%; margin-top: 10%; margin-left: 22%;"
controls>
<source type="video/mp4" src="data:video/mp4;base64,` +
decryptText.toString() + // final decrypted data
`">
</video>
</body>
</html>`;
this.setState({ playvideo: !this.state.playvideo }); // state set for playing video at end of decryption
console.log("File decrypted");
});
});
}

Web View Code

<WebView
style={{ flex: 1 }}
source={{ html: htmlCode }}
/>

需要帮助找到在 react-native 中播放来自 base64 的视频的方法/替代方案。

这是一个离线电子学习应用程序,视频存储在 SD 卡上,数据在运行中解密并在视频播放器中播放。

最佳答案

可以通过让您的 WebView 嵌入 javascript 代码来从设备存储中读取文件内容来解决这个问题,以避免内联这么大的 base64 文字。

如所述here ,建议的解决方法是使用 blob URL。

基本上你必须:

  • 1:导入RNFetchBlobsimpleCrypto在 Web View 中。 (参见 here)
  • 2:获取文件并解密,
  • 3:创建 blob url 并将其设置为 <video>源属性。

您的代码将如下所示:

componentDidMount() {
this.setState({htmlCode: `
<html>
<body>
<video id="myvideo" style="width: 50%; height: 50%; margin-top: 10%; margin-left: 22%;" controls></video>

<script src="${RNFetchBlob.fs.dirs.MainBundleDir}/bundle.js"></script>
<script src="${path/to/simpleCrypto.js}"></script>

<script type="text/javascript">
function b64toBlob(b64Data, contentType, sliceSize) {
//... returns a new Blob using the b64Data.
}

//for simplicity, onDecodeEnd abstracts your decryption code
RNFetchBlob.fs.readStream('encryptfile1.dat').onDecodeEnd((decryptText) => {
var blob = b64toBlob(base64Video, "video/mp4");
var url = URL.createObjectURL(blob);
document.getElementById('myvideo').src = url;
})
</script>
</body>
</html>
`})

render() {
return (
<WebView
style={{ flex: 1 }}
source={{ html: this.state.htmlCode, baseUrl: RNFetchBlob.fs.dirs.DCIMDir }}>
</WebView>
);
}

免责声明

  • 1:我能够使用嵌入大型 base64 内联文字 (2.5mb) 的 Webview 重现您的限制问题。它适用于 850kb 的 base64 视频。
  • 2:Blob URL 方法通过获取包含较大的 base64 视频的远程 json 文件,确实解决了 WebView 的这一限制。
  • 3:我没有测试将 RNFetchBlob 导入 WebView 的方法。同样,如所述here它似乎有效。

附加代码

function b64toBlob(b64Data, contentType, sliceSize) {
contentType = contentType || '';
sliceSize = sliceSize || 512;

var byteCharacters = atob(b64Data);
var byteArrays = [];

for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
var slice = byteCharacters.slice(offset, offset + sliceSize);

var byteNumbers = new Array(slice.length);
for (var i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}

var byteArray = new Uint8Array(byteNumbers);

byteArrays.push(byteArray);
}

var blob = new Blob(byteArrays, {type: contentType});
return blob;
}

附言

我自己不会选择这种 base64 方法。我宁愿有一些本地代码,由 React Native 触发,可以编写和读取加密视频。读取将生成一个从 react-native-video 加载的 temp.mp4。模块。在幕后,加密是在字节级别完成的。所以我们不需要来回解析到base64。毕竟我们处理的是二进制文件。

关于android - 在 React-Native 中使用 base64 编码的字符串播放视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54348500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com