【问题标题】:Corrupt audio file after copying over bluetooth stream通过蓝牙流复制后损坏的音频文件
【发布时间】:2015-04-28 13:40:03
【问题描述】:

我通过蓝牙套接字连接将音频文件发送到另一台设备。我正在逐字节复制,所以另一端的大小完全相同。 但是,当我尝试在另一端播放文件时,我只会听到尴尬的噪音(每次启动播放器时听起来都有些不同)。

现在奇怪的部分:只要我将“损坏”文件复制到另一个位置(通过一些 android 文件管理器),我就可以播放它,而且听起来完全没问题!

有什么想法吗?

发送:

outputStream = mSocket.getOutputStream();
long totalLength = file.length();
String command = Protocol.COMMAND_SEND_FILE + Protocol.SEPARATOR + file.getName() + Protocol.SEPARATOR + totalLength;
outputStream.write(command.getBytes());
outputStream.flush();

long bytesWritten = 0;
while ((c = is.read(buffer, 0, buffer.length)) > 0) {
    outputStream.write(buffer, 0, c);
    outputStream.flush();

    bytesWritten += c;
}
mLogger.log("sent total of bytes", bytesWritten+"");
is.close();

接收:

while (mRunning) {

    final StringBuilder sb = new StringBuilder();
    if (!mReceiveFile) {
        bytesRead = mInputStream.read(buffer);
        if (bytesRead != -1) {
            String result = "";
            while ((bytesRead == bufferSize) && (buffer[bufferSize] != 0)) {
                result = result + new String(buffer, 0, bytesRead);
                bytesRead = mInputStream.read(buffer);
            }
            result = result + new String(buffer, 0, bytesRead);
            sb.append(result);
        }
    } else {
        if (mLogger != null) {
            mLogger.log("receiving file", mReceiveFilename);
        }
        int c = 0;
        long bRead = 0;
        OutputStream oos = new FileOutputStream(Utils.getAppRootDir() + "/" + mReceiveFilename);

        while (bRead < mReceiveFileLength && (c = mInputStream.read(buffer, 0, buffer.length)) > 0) {
            if ((bRead + bufferSize) >= mReceiveFileLength) {
                c = (int) (mReceiveFileLength - bRead);
                mLogger.log("rest bytes", "" + c);
            }
            if(bRead < 10000 || bRead + 10000 > mReceiveFileLength){
                mLogger.log(new String(buffer));
            }
            oos.write(buffer, 0, c);
            oos.flush();
            bRead += c;
            mLogger.log("read " + bRead + " of " + mReceiveFileLength + " bytes");
        }
        oos.close();


        mLogger.log("saved file", mReceiveFilename);


        mReceiveFile = false;
        mReceiveFilename = null;

    }
    if (sb.toString().startsWith(Protocol.COMMAND_SEND_FILE)) {
        // "SEND_FILE:filename.ext"
        try {
            String[] command = sb.toString().split(Protocol.SEPARATOR);
            mReceiveFile = true;
            mReceiveFilename = command[1];
            mReceiveFileLength = Long.parseLong(command[2]);
        } catch (Exception e) {
            mLogger.log("Protocoll exception command could not be parsed:" + sb.toString());
        }
    } else {
        EventBus.getDefault().post(new BluetoothCommunicator(sb.toString()));
    }

}

【问题讨论】:

    标签: android file sockets audio bluetooth


    【解决方案1】:

    我发现我必须在创建新文件后启动媒体扫描仪。之后它就像一个魅力!

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 2012-11-04
      • 2012-02-16
      相关资源
      最近更新 更多