我正在开发一个Android项目,需要我将视频文件分成几个部分(比如每个5 MB),然后单独播放这些部分。 我已成功将视频分割成部分,但这些部分没有播放。(可能缺少播放器识别的一些播放属性)。 如果有人可以提供关于如何在代码的上下文中不合并(我的项目所必需)的方式来播放这些单独部分的解决方案。 PS。不能使用任何第三方软件制作Android应用程序。
这是我正在使用的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final TextView textView = (TextView) findViewById(R.id.textView);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
textView.setText("Successfull");
splitFile(new File(Environment.getExternalStorageDirectory() + "/testing1/video.mp4"));
}
}
);
}
public static void splitFile(File f) {
int partCounter = 1;//I like to name parts from 001, 002, 003, ...
//you can change it to 0 if you want 000, 001, ...
int sizeOfFiles = 1024 * 1024 * 10;// 10MB
byte[] buffer = new byte[sizeOfFiles];
try (BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(f))) {//try-with-resources to ensure closing stream
String name = f.getName();
int tmp = 0;
while ((tmp = bis.read(buffer)) > 0) {
//write each chunk of data into separate file with different number in name
File newFile = new File(f.getParent(), name + "."
+ String.format("%03d", partCounter++)+".mp4");
try (FileOutputStream out = new FileOutputStream(newFile)) {
out.write(buffer, 0, tmp);//tmp is chunk size
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
答案 0 :(得分:2)
它永远不会以这种方式工作。您实际上在做的只是将二进制文件拆分为多个部分。 mp4
视频(或任何格式)视频的数据以特定格式编码,只是将文件分成几部分不会分割视频本身。它将使部件呈现不可读(读取:不可播放)。视频文件中的初始字节通常包含有关视频文件的元数据。你必须阅读有关MP4格式规范的内容,并且必须编写一个编码器/解码器(这不会是一杯茶)。
最好使用库分割视频文件。
答案 1 :(得分:1)
您只是将二进制文件拆分为多个部分。视频文件使用称为编解码器的程序以特殊格式编码。如果你想让你的块可以播放,你必须确保它们的格式正确,根据原始的编解码器。
也许您可以查看this之类的内容。它显示了如何使用ffmpeg
将视频文件拆分为可播放的块。如果它在Android上可用,您也可以尝试使用它。