首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FFmpeg可执行文件Chmod权限

FFmpeg可执行文件Chmod权限
EN

Stack Overflow用户
提问于 2013-11-26 03:01:52
回答 2查看 3.6K关注 0票数 2

尝试使用存储在原始文件夹eclipse for android app中的可执行文件运行FFmpeg命令。我得到了权限拒绝错误,无法调整视频大小。如何才能从我的java文件中获得正确的权限。

EN

回答 2

Stack Overflow用户

发布于 2013-11-26 03:10:04

将此代码放入静态类中或放在您想要的任何位置:

代码语言:javascript
复制
public static void installBinaryFromRaw(Context context, int resId, File file) {
    final InputStream rawStream = context.getResources().openRawResource(resId);
    final OutputStream binStream = getFileOutputStream(file);

    if (rawStream != null && binStream != null) {
        pipeStreams(rawStream, binStream);

        try {
            rawStream.close();
            binStream.close();
        } catch (IOException e) {
            Log.e(TAG, "Failed to close streams!", e);
        }       

        doChmod(file, 777);
    }       
}
public static OutputStream getFileOutputStream(File file) {
    try {
        return new FileOutputStream(file);
    } catch (FileNotFoundException e) {
        Log.e(TAG, "File not found attempting to stream file.", e);
    }
    return null;
}

public static void pipeStreams(InputStream is, OutputStream os) {
    byte[] buffer = new byte[IO_BUFFER_SIZE];
    int count;
    try {
        while ((count = is.read(buffer)) > 0) {
            os.write(buffer, 0, count);
        }
    } catch (IOException e) {
        Log.e(TAG, "Error writing stream.", e);
    }
}
public static void doChmod(File file, int chmodValue) {
    final StringBuilder sb = new StringBuilder();
    sb.append("chmod");
    sb.append(' ');
    sb.append(chmodValue);
    sb.append(' ');
    sb.append(file.getAbsolutePath());

    try {
        Runtime.getRuntime().exec(sb.toString());
    } catch (IOException e) {
        Log.e(TAG, "Error performing chmod", e);
    }
}

并使用下面的代码调用它:

代码语言:javascript
复制
private void installFfmpeg() {
    File ffmpegFile = new File(getCacheDir(), "ffmpeg");
    mFfmpegInstallPath = ffmpegFile.toString();
    Log.d(TAG, "ffmpeg install path: " + mFfmpegInstallPath);

    if (!ffmpegFile.exists()) {
        try {
            ffmpegFile.createNewFile();
        } catch (IOException e) {
            Log.e(TAG, "Failed to create new file!", e);
        }
        Utils.installBinaryFromRaw(this, R.raw.ffmpeg, ffmpegFile);
    }else{
        Log.d(TAG, "It was already installed");
    }

    ffmpegFile.setExecutable(true);
    Log.d(TAG, String.valueOf(ffmpegFile.canExecute()));
}

希望它是有用的!

票数 2
EN

Stack Overflow用户

发布于 2013-12-09 03:42:21

您的安卓应用程序必须具有在AndroidManifest.xml中读取和写入存储的权限

代码语言:javascript
复制
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />.

另一个警告是路径,/storage/emulated/0/不是在所有设备上都可用,您应该使用Environment.getExternalStorageDirectory()来查找实际路径。

最后,有一个简单的解决办法,而不是从原始文件夹提取ffmpeg,将其重命名为lib...ffmpeg...so,并将其放入项目的libs/armeabi目录中。

当然,您稍后将运行Runtime.getRuntime().exec(getContext().getApplicationInfo().nativeLibraryDir + "/lib...ffmpeg...so" +,无论)是什么

系统安装程序会自动将可执行文件解压到/data/data/your.package.full.name/lib中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20201067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档