Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 视频文件到字符串和反向-损坏的文件_Java_Android_File_Video_Fileutils - Fatal编程技术网

Java 视频文件到字符串和反向-损坏的文件

Java 视频文件到字符串和反向-损坏的文件,java,android,file,video,fileutils,Java,Android,File,Video,Fileutils,我正在编写一个应用程序,它需要5秒的视频(.mp4文件)并将其作为base64字符串上传到服务器。用户可以下载视频,此时字符串应转换回文件 我遇到了一个问题,下载的文件被保存了,但是它比原始文件稍微小(2到3KB),并且无法播放。并非每次拍摄视频时都会发生此问题;我一直在试图找到这种行为的模式,但还没有找到 视频文件是通过MediaRecorder录制创建的文件。我可以毫无问题地回放这个原始文件 编码片段: //videoFile path: Environment.getExternalSto

我正在编写一个应用程序,它需要5秒的视频(.mp4文件)并将其作为base64字符串上传到服务器。用户可以下载视频,此时字符串应转换回文件

我遇到了一个问题,下载的文件被保存了,但是它比原始文件稍微小(2到3KB),并且无法播放。并非每次拍摄视频时都会发生此问题;我一直在试图找到这种行为的模式,但还没有找到

视频文件是通过MediaRecorder录制创建的文件。我可以毫无问题地回放这个原始文件

编码片段:

//videoFile path: Environment.getExternalStorageDirectory() + "/Pictures/" + timestamp + ".mp4"
byte[] bytes = FileUtils.readFileToByteArray(videoFile);
String encodedVideo = Base64.encodeToString(bytes, Base64.URL_SAFE);
File download = new File(Environment.getExternalStorageDirectory() +"/Pictures/test_"+videoFile.getName());
byte[] decode = Base64.decode(encodedVideo, Base64.URL_SAFE);
FileUtils.writeByteArrayToFile(download, decode);
Log.i("compare arrays",""+(Arrays.toString(bytes)).compareTo(Arrays.toString(decoded)));
解码代码段:

//videoFile path: Environment.getExternalStorageDirectory() + "/Pictures/" + timestamp + ".mp4"
byte[] bytes = FileUtils.readFileToByteArray(videoFile);
String encodedVideo = Base64.encodeToString(bytes, Base64.URL_SAFE);
File download = new File(Environment.getExternalStorageDirectory() +"/Pictures/test_"+videoFile.getName());
byte[] decode = Base64.decode(encodedVideo, Base64.URL_SAFE);
FileUtils.writeByteArrayToFile(download, decode);
Log.i("compare arrays",""+(Arrays.toString(bytes)).compareTo(Arrays.toString(decoded)));
下载的文件与原始文件存储在同一目录中

编辑以澄清:

“compare arrays”Log语句给出的结果为0,因此数组
字节
解码
应该具有相同的内容

我添加了其他日志语句:

Log.i("compare contents", ""+FileUtils.contentEquals(videoFile,download));
Log.i("original checksum", ""+FileUtils.checksumCRC32(videoFile));
Log.i("download checksum", ""+FileUtils.checksumCRC32(download));
以更直接地比较文件的内容

比较数组的log语句始终返回0,但
contentEquals
log语句并不总是真的。如果为false,则文件的校验和不同。由于字节数组具有相同的内容,我相信校验和与实际文件内容也会相同。这显然是错误的,但我不知道如何解决这个问题。同样,我还没有找到一个可识别的模式来判断下载的文件是否错误


感谢您的帮助。我哪里出错了?

一切正常,您是否检查了FileUtils的读/写方法是否正确,跳过解码,只将字节写入文件,FileUtils.WriteByteArrayFile(下载,解码,错误)@Khang.NT我尝试使用该行,但它没有改变任何东西-文件比较仍然返回false。我还尝试完全绕过FileUtils并编写了自己的读写函数,但文件比较仍然失败。一切正常,您是否检查了FileUtils的读写方法是否正确,跳过解码,只将字节写入文件,FileUtils.writeByteArrayToFile(下载,解码,错误)@Khang.NT我尝试使用该行,但它没有改变任何东西-文件比较仍然返回false。我还尝试完全绕过FileUtils并编写自己的读写函数,但文件比较仍然失败。