【问题标题】:Convert mp4 videos to support streaming in android转换 mp4 视频以支持 android 中的流式传输
【发布时间】:2015-08-23 06:16:01
【问题描述】:

我正在开发 android 应用程序,它以 mp4 格式录制视频并将其上传到服务器,然后其他用户可以观看该视频。

我的问题是 mp4 不支持我在应用中需要的流媒体,而是需要下载所有视频才能开始播放。

我搜索了这个问题,发现支持流媒体的 mp4 具有 faststart 属性,它将 moov atom 放在视频文件的开头。

我的问题是如果可以的话,如何在 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;
    }

【问题讨论】:

    标签: android video ffmpeg mp4


    【解决方案1】:

    如果您可以选择自己的场景,我建议您修改服务器上的视频,因为您通常在服务器上拥有更多的“马力”,并且对您的用户的影响较小。

    我认为您也可能会发现它更容易 - 虽然您可以将 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 包装器,以下是一个很好的起点:

    在上面的第二个链接中,请确保您特别注意 cmets 关于调用 ffmpeg 两次。这可能很棘手,因为它最初似乎可以工作,但会在多次运行时崩溃。

    【讨论】:

    • 部分我完全不同意:doing the modification to the video on server 因为服务器应该处理 1000 个用户的修改,它会杀死它!而每个用户都可以在他们的应用程序中修改他们的视频并将其发送到服务器。在服务器端这样做的代价非常高。
    • @SepehrGH - 我想这取决于每个单独的应用程序和场景。许多视频流服务如果想要提供高质量的流,实际上会在服务器端进行相当多的处理,例如将视频转码为多个比特率,所以像将 MOOV atom 调整到开头这样的事情会非常小。如果您试图开发一个服务器端资源最少的解决方案,并且用户可以容忍他们设备上的任何处理延迟,那么您所说的设备端会更好。
    猜你喜欢
    • 2019-04-22
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 2015-06-29
    • 1970-01-01
    相关资源
    最近更新 更多