pdyinotia 2023-09-18 15:41 采纳率: 0%
浏览 1

使用安卓作为tcp客户端,向服务器推送视频流, 内存溢出

咨询一下
我在安卓里面使用tcp(java.net.Socket)作为客户端发送30hz视频流到服务端,如果服务器代码断点或者休眠了,我的客户端几秒之后就会报内存溢出直接崩溃闪退。
我在socket初始化和发送数据部分都加了try catch无法捕捉到错误,发送数据使用如下代码

if(outputStream == null)outputStream=_socket.getOutputStream();
outputStream.write(inputData);
outputStream.flush();

初始化socket使用如下代码

_socket = new Socket(_targetIP,_targetPort);

想问问发生这种情况如何避免安卓程序崩溃,有什么检测方法能够知晓服务器端被阻塞了(send方法没有抛出任何异常),知晓阻塞之后如何快速释放掉发布出去的缓存

报的错误如下
FATAL EXCEPTION: video hardware encoder thread
java.lang.OutOfMemoryError: Failed to allocate a 1382412 byte allocation with 1143296 free bytes and 1116KB until OOM

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-18 18:07
    关注

    【以下回答由 GPT 生成】

    问题解决方案

    避免安卓应用崩溃的情况有多种。下面提供一些可能的解决方案和建议:

    1. 问题描述中的代码逻辑不正确,应先创建Socket对象,然后再获取输出流,否则可能会导致NullPointerException。应修改代码如下:

      java _socket = new Socket(_targetIP, _targetPort); outputStream = _socket.getOutputStream(); outputStream.write(inputData); outputStream.flush();

    2. 考虑使用BufferedOutputStream来缓冲输出流,这样可以提高数据输出的性能,示例如下所示:

      java BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream); bufferedOutputStream.write(inputData); bufferedOutputStream.flush();

    3. 针对内存溢出问题,可以尝试通过减少应用的内存使用来解决。以下是一些可能的解决方案:

      3.1. 尽量避免在循环中重复创建对象(如Byte数组),可以事先分配合适大小的缓冲区,并在循环中重用。

      3.2. 对于大型视频流,可以使用分块发送的方式,降低一次性发送大量数据的压力。可以考虑使用DataOutputStream来分块发送视频流数据。

      java DataOutputStream dataOutputStream = new DataOutputStream(outputStream); int chunkSize = 1024; // 分块大小,可以根据实际情况调整 for (int i = 0; i < inputData.length; i += chunkSize) { int length = Math.min(chunkSize, inputData.length - i); dataOutputStream.write(inputData, i, length); dataOutputStream.flush(); }

      3.3. 如果可能的话,可以使用更高级的数据传输协议(如TCP/IP)来发送视频流,而不是自己进行底层的字节传输。这样可以由协议栈处理数据发送和接收的细节,从而减少应用层的内存开销。

    4. 对于服务器端是否被阻塞的检测,可以考虑在客户端设置一个超时时间来判断是否超时。可以使用Socket.setSoTimeout方法设置读取超时时间,如果在超时时间内没有收到服务器的响应,可以认为服务器被阻塞。

      java _socket = new Socket(_targetIP, _targetPort); _socket.setSoTimeout(5000); // 设置超时时间为5秒 outputStream = _socket.getOutputStream(); outputStream.write(inputData); outputStream.flush();

    5. 如果发现服务器被阻塞,可以关闭并重新创建Socket对象来释放资源。

      java _socket.close(); _socket = new Socket(_targetIP, _targetPort);

    以上是一些可能的解决方案和建议,希望对您有帮助。如果问题仍然存在,请提供更多相关代码和错误日志,以便我们能够更深入地帮助您解决问题。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 修改了问题 9月18日
  • 创建了问题 9月18日

悬赏问题

  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口