我正在开发以mp4格式录制视频并将其上传到服务器的Android应用程序,然后其他用户可以查看该视频。
我的问题是mp4不支持我在我的应用中需要的流媒体,而是需要下载所有视频才能开始播放。
我用谷歌搜索了这个问题,我发现支持流媒体的mp4具有faststart属性,它将moov原子放在视频文件的开头。
我的问题是如何在android中实现它,如果它可以??如果没有,我可以在服务器上做到这一点吗?
录制视频的代码是:
if (requestCode == REQUEST_VIDEO_CAPTURE ) {
try
{
Log.e("videopath","videopath");
AssetFileDescriptor videoAsset = getContentResolver().openAssetFileDescriptor(data.getData(), "r");
FileInputStream fis = videoAsset.createInputStream();
File root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);
if (!root.exists()) {
root.mkdirs();
}
File file;
file=new File(root,"android_"+System.currentTimeMillis()+".mp4" );
videoUri = Uri.fromFile(file);
FileOutputStream fos = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len;
while ((len = fis.read(buf)) > 0) {
fos.write(buf, 0, len);
}
fis.close();
fos.close();
}
catch (Exception e)
{
e.printStackTrace();
}
return;
}
答案 0 :(得分:0)
如果您可以选择自己的方案,我建议您在服务器上对视频进行修改,因为您通常会有更多的马力'在服务器上,它对用户的影响较小。
我认为您也可能会发现它更容易 - 虽然您可以将ffmpeg集成到您的Android应用程序中,但这并不是一件容易的事情,您必须小心谨慎地使用您的应用程序的新版本更新它。
在服务器端执行此操作的一种相对简单的方法是运行使用命令行程序调用ffmpeg来执行转换的作业或任务 - 它可能不如直接使用ffmpeg C库那样有效但它具有ffmpeg本身更改时易于更新的优点,以及通常可以在命令行中使用ffmpeg进行更多讨论和帮助的优势。
选项等可能会随着时间的推移而发生变化,因此这可能会过时,但以下格式(来自此stackOverflow答案:https://stackoverflow.com/a/14172629/334402)之前对我有用:
ffmpeg -i <input> -c:v libx264 -profile:v baseline -c:a libfaac -ar 44100 -ac 2 -b:a 128k -movflags faststart output.mp4
如果你想在Android应用程序上这样做,你可以使用相同的格式,如果你使用一个Android包装库,或者你可以编写自己的fffmpeg包装库。也可以直接在Android中使用ffmpeg C库,虽然我没有亲自下载。
如果您想使用Android ffmpeg包装器,以下是一个很好的起点:
在上面的第二个链接中,请务必注意有关两次调用ffmpeg的注释。这可能很棘手,因为它似乎最初起作用,但会在多次运行时崩溃。