世中逢尔 2024-04-30 08:31 采纳率: 0%
浏览 20
已结题

uniapp app端对后端返回的二进制视频文件怎么处理赋值给video

在像后端发送请求后,会根据传入的影像平台id向后端请求数据,返回二进制流数据


uni.request({
                    url: "xxx",
                    method:'post', 
                    timeout: 10000,
                    data: {
                        "fileId":"xx"
                    },
                    responseType:"arraybuffer",
                    success: (successData) => {
    }
})

在获得流数据后怎么处理才可以在android端进行播放?
我尝试过使用new Blob 可是在android Blob未定义
随后我尝试写入文件

    const tempFileName = 'temp_video.mp4';
                            const tempFilePath = `_doc/${tempFileName}`; // _doc 为临时文件目录
                            plus.io.requestFileSystem(plus.io.PRIVATE_DOC, (fs) => {
                              // 调用 fs.root.getFile 创建临时文件
                              fs.root.getFile(tempFilePath, {create: true}, (fileEntry) =>  {
                                fileEntry.file(file => {
                                    fileEntry.createWriter(writer => {
                                         console.log( fs.root.toURL(),'路径111')
                                            plus.nativeUI.showWaiting("正在保存信息");
                                            // writer.seek(seek); //覆盖文件
                                            // const writeDataTemp = JSON.stringify(writeData, null,
                                            //     "\r").replace(/[\r]/g, "");
                                            console.log(base64);
                                            writer.write(base64); // 整个文件重写
                                            writer.onerror = () =>  {
                                                console.log("4写入文件失败", writer.error.message);
                                                plus.nativeUI.closeWaiting();
                                                plus.nativeUI.toast("修改信息失败,请重新操作", {
                                                    background: "rgba(255, 255, 255, 0.6)",
                                                });
                                                return;
                                            };
                                            writer.onsuccess = (e) =>  { //填写文件成功
                                            
                                                plus.nativeUI.closeWaiting();
                                                plus.nativeUI.toast("保存成功", {
                                                    // background: "rgba(255, 255, 255, 0.6)",
                                                });
                                                console.log(e.target.fileName);
                                            };
                                        },
                                        error => {
                                            console.log("3创建creactWriter失败", error);
                                            plus.nativeUI.toast("保存文件失败,请重新操作", {
                                                // background: "#ffa38c",
                                            });
                                            return;
                                        });
                                });
                              }, (error)  => {
                                console.log('创建临时文件失败:', error.message);
                              });
                            }, (error) =>  {
                              console.log('请求文件系统失败:', error.message);
                            });

可是这种方法只能写入String类型的数据 ,还有什么办法?求解答

new blob不能使用 显示未定义

  • 写回答

23条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-04-30 08:31
    关注
    获得0.30元问题酬金
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    处理二进制流数据的方法取决于你想在Android端如何使用这些数据。如果你需要将这些二进制流数据作为视频播放,则可以使用VideoView类。 首先,将请求返回的二进制流数据转换为Base64编码。在uni-app中,可以使用Uint8Array将ArrayBuffer转换为二进制流,再将其转换为Base64编码。例如: successData = new Uint8Array(successData.data); let base64Data = btoa(String.fromCharCode.apply(null, successData)); 接下来,将该Base64编码传递到Android的Activity中,可以使用Intent传递数据。例如: import android.content.Intent; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.MediaController; import android.widget.VideoView; public class MainActivity extends AppCompatActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        VideoView videoView = findViewById(R.id.videoView);
        MediaController mediaController = new MediaController(this);
        mediaController.setAnchorView(videoView);
        
        Intent intent = getIntent();
        String base64Data = intent.getStringExtra("base64Data");
        
        byte[] decodedUserData = Base64.decode(base64Data, Base64.DEFAULT);
        Uri videoUri = Uri.parse(decodedUserData);
        videoView.setMediaController(mediaController);
        videoView.setVideoURI(videoUri);
        videoView.requestFocus();
        videoView.start();
    }
    

    } 最后,在uni-app中发送Intent: let intent = new Intent(Intent.ACTION_VIEW); intent.setClassName('com.example', 'com.example.MainActivity'); intent.putExtra('base64Data', base64Data); this.$startActivity(intent); 需要注意的是,若要在uni-app中运行此功能,需要使用插件uni-android-permissions来获取外部存储权限。另外,需要将需要传递的类名和包名更改为你自己的类和包名。

    评论

报告相同问题?

问题事件

  • 系统已结题 5月8日
  • 修改了问题 4月30日
  • 创建了问题 4月30日

悬赏问题

  • ¥15 Todesk 远程写代码 anaconda jupyter python3
  • ¥15 我的R语言提示去除连锁不平衡时clump_data报错,图片以下所示,卡了好几天了,苦恼不知道如何解决,有人帮我看看怎么解决吗?
  • ¥15 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?
  • ¥15 有偿四位数,节约算法和扫描算法
  • ¥15 VUE项目怎么运行,系统打不开
  • ¥50 pointpillars等目标检测算法怎么融合注意力机制
  • ¥20 Vs code Mac系统 PHP Debug调试环境配置