在android中使用无NDK的FFmpeg

在android中使用无NDK的FFmpeg,android,android-ndk,ffmpeg,shared-libraries,Android,Android Ndk,Ffmpeg,Shared Libraries,我浏览了很多关于android项目的“FFMPEG”实现的网站和搜索 大多数解决方案都使用NDK 但是我想使用FFmpeg而不使用NDK,正如我在中发现的那样,我使用了这个项目 它已经为android版本的FFMPEG库编译,该文件将位于res/raw文件夹中(如果需要更新版本,您可以更新该文件)。您需要将此项目作为库添加到您的。之后,您可以用java编写自己的函数,例如: public Clip convert (Clip mediaIn, String outPath, ShellCall

我浏览了很多关于android项目的“FFMPEG”实现的网站和搜索

大多数解决方案都使用NDK

但是我想使用FFmpeg而不使用NDK,正如我在

中发现的那样,我使用了这个项目

它已经为android版本的FFMPEG库编译,该文件将位于res/raw文件夹中(如果需要更新版本,您可以更新该文件)。您需要将此项目作为库添加到您的。之后,您可以用java编写自己的函数,例如:

public Clip convert (Clip mediaIn, String outPath, ShellCallback sc) throws Exception
{
    ArrayList<String> cmd = new ArrayList<String>();

    cmd.add(mFfmpegBin);
    cmd.add("-y");
    cmd.add("-i");
    cmd.add(new File(mediaIn.path).getCanonicalPath());

    if (mediaIn.startTime != null)
    {
        cmd.add("-ss");
        cmd.add(mediaIn.startTime);
    }
    if (mediaIn.duration != -1)
    {
        cmd.add("-t");
        cmd.add(String.format(Locale.US,"%f",mediaIn.duration));

    }
    Clip mediaOut = new Clip();
    File fileOut = new File(outPath);
    mediaOut.path = fileOut.getCanonicalPath();
    cmd.add(mediaOut.path);
    execFFMPEG(cmd, sc);
    return mediaOut;
}
    public Clip convert(Clip mediaIn, String outPath, ShellCallback sc) throws Exception
    {
    ArrayList<String> cmd = new ArrayList<String>();

    Clip mediaOut = new Clip();

    String mediaPath = mediaIn.path;

    cmd = new ArrayList<String>();

    cmd.add(mFfmpegBin);
    cmd.add("-i");
    cmd.add(mediaPath);

    cmd.add("-b:a");
    cmd.add("128k");

    mediaOut.path = outPath;

    cmd.add(mediaOut.path);

    execFFMPEG(cmd, sc);

    return mediaOut; // this is not importatnt because file will be put in outPath
    }
您需要将函数添加到FfmpegController.java类中。大概是这样的:

public Clip convert (Clip mediaIn, String outPath, ShellCallback sc) throws Exception
{
    ArrayList<String> cmd = new ArrayList<String>();

    cmd.add(mFfmpegBin);
    cmd.add("-y");
    cmd.add("-i");
    cmd.add(new File(mediaIn.path).getCanonicalPath());

    if (mediaIn.startTime != null)
    {
        cmd.add("-ss");
        cmd.add(mediaIn.startTime);
    }
    if (mediaIn.duration != -1)
    {
        cmd.add("-t");
        cmd.add(String.format(Locale.US,"%f",mediaIn.duration));

    }
    Clip mediaOut = new Clip();
    File fileOut = new File(outPath);
    mediaOut.path = fileOut.getCanonicalPath();
    cmd.add(mediaOut.path);
    execFFMPEG(cmd, sc);
    return mediaOut;
}
    public Clip convert(Clip mediaIn, String outPath, ShellCallback sc) throws Exception
    {
    ArrayList<String> cmd = new ArrayList<String>();

    Clip mediaOut = new Clip();

    String mediaPath = mediaIn.path;

    cmd = new ArrayList<String>();

    cmd.add(mFfmpegBin);
    cmd.add("-i");
    cmd.add(mediaPath);

    cmd.add("-b:a");
    cmd.add("128k");

    mediaOut.path = outPath;

    cmd.add(mediaOut.path);

    execFFMPEG(cmd, sc);

    return mediaOut; // this is not importatnt because file will be put in outPath
    }
public Clip convert(Clip mediaIn、字符串输出路径、shell回调sc)引发异常
{
ArrayList cmd=新的ArrayList();
Clip mediaOut=新剪辑();
字符串mediaPath=mediaIn.path;
cmd=newarraylist();
命令添加(mFfmpegBin);
cmd.添加(“-i”);
cmd.add(mediaPath);
命令添加(“-b:a”);
命令添加(“128k”);
mediaOut.path=输出路径;
cmd.add(mediaOut.path);
execFFMPEG(cmd,sc);
return mediaOut;//这不重要,因为文件将放在outPath中
}
现在在您的项目中初始化FfmpegController对象并运行您的函数。

我已经使用了这个项目

它已经为android版本的FFMPEG库编译,该文件将位于res/raw文件夹中(如果需要更新版本,您可以更新该文件)。您需要将此项目作为库添加到您的。之后,您可以用java编写自己的函数,例如:

public Clip convert (Clip mediaIn, String outPath, ShellCallback sc) throws Exception
{
    ArrayList<String> cmd = new ArrayList<String>();

    cmd.add(mFfmpegBin);
    cmd.add("-y");
    cmd.add("-i");
    cmd.add(new File(mediaIn.path).getCanonicalPath());

    if (mediaIn.startTime != null)
    {
        cmd.add("-ss");
        cmd.add(mediaIn.startTime);
    }
    if (mediaIn.duration != -1)
    {
        cmd.add("-t");
        cmd.add(String.format(Locale.US,"%f",mediaIn.duration));

    }
    Clip mediaOut = new Clip();
    File fileOut = new File(outPath);
    mediaOut.path = fileOut.getCanonicalPath();
    cmd.add(mediaOut.path);
    execFFMPEG(cmd, sc);
    return mediaOut;
}
    public Clip convert(Clip mediaIn, String outPath, ShellCallback sc) throws Exception
    {
    ArrayList<String> cmd = new ArrayList<String>();

    Clip mediaOut = new Clip();

    String mediaPath = mediaIn.path;

    cmd = new ArrayList<String>();

    cmd.add(mFfmpegBin);
    cmd.add("-i");
    cmd.add(mediaPath);

    cmd.add("-b:a");
    cmd.add("128k");

    mediaOut.path = outPath;

    cmd.add(mediaOut.path);

    execFFMPEG(cmd, sc);

    return mediaOut; // this is not importatnt because file will be put in outPath
    }
您需要将函数添加到FfmpegController.java类中。大概是这样的:

public Clip convert (Clip mediaIn, String outPath, ShellCallback sc) throws Exception
{
    ArrayList<String> cmd = new ArrayList<String>();

    cmd.add(mFfmpegBin);
    cmd.add("-y");
    cmd.add("-i");
    cmd.add(new File(mediaIn.path).getCanonicalPath());

    if (mediaIn.startTime != null)
    {
        cmd.add("-ss");
        cmd.add(mediaIn.startTime);
    }
    if (mediaIn.duration != -1)
    {
        cmd.add("-t");
        cmd.add(String.format(Locale.US,"%f",mediaIn.duration));

    }
    Clip mediaOut = new Clip();
    File fileOut = new File(outPath);
    mediaOut.path = fileOut.getCanonicalPath();
    cmd.add(mediaOut.path);
    execFFMPEG(cmd, sc);
    return mediaOut;
}
    public Clip convert(Clip mediaIn, String outPath, ShellCallback sc) throws Exception
    {
    ArrayList<String> cmd = new ArrayList<String>();

    Clip mediaOut = new Clip();

    String mediaPath = mediaIn.path;

    cmd = new ArrayList<String>();

    cmd.add(mFfmpegBin);
    cmd.add("-i");
    cmd.add(mediaPath);

    cmd.add("-b:a");
    cmd.add("128k");

    mediaOut.path = outPath;

    cmd.add(mediaOut.path);

    execFFMPEG(cmd, sc);

    return mediaOut; // this is not importatnt because file will be put in outPath
    }
public Clip convert(Clip mediaIn、字符串输出路径、shell回调sc)引发异常
{
ArrayList cmd=新的ArrayList();
Clip mediaOut=新剪辑();
字符串mediaPath=mediaIn.path;
cmd=newarraylist();
命令添加(mFfmpegBin);
cmd.添加(“-i”);
cmd.add(mediaPath);
命令添加(“-b:a”);
命令添加(“128k”);
mediaOut.path=输出路径;
cmd.add(mediaOut.path);
execFFMPEG(cmd,sc);
return mediaOut;//这不重要,因为文件将放在outPath中
}
现在在您的项目中初始化FfmpegController对象并运行您的函数。

我已经使用了这个项目

它已经为android版本的FFMPEG库编译,该文件将位于res/raw文件夹中(如果需要更新版本,您可以更新该文件)。您需要将此项目作为库添加到您的。之后,您可以用java编写自己的函数,例如:

public Clip convert (Clip mediaIn, String outPath, ShellCallback sc) throws Exception
{
    ArrayList<String> cmd = new ArrayList<String>();

    cmd.add(mFfmpegBin);
    cmd.add("-y");
    cmd.add("-i");
    cmd.add(new File(mediaIn.path).getCanonicalPath());

    if (mediaIn.startTime != null)
    {
        cmd.add("-ss");
        cmd.add(mediaIn.startTime);
    }
    if (mediaIn.duration != -1)
    {
        cmd.add("-t");
        cmd.add(String.format(Locale.US,"%f",mediaIn.duration));

    }
    Clip mediaOut = new Clip();
    File fileOut = new File(outPath);
    mediaOut.path = fileOut.getCanonicalPath();
    cmd.add(mediaOut.path);
    execFFMPEG(cmd, sc);
    return mediaOut;
}
    public Clip convert(Clip mediaIn, String outPath, ShellCallback sc) throws Exception
    {
    ArrayList<String> cmd = new ArrayList<String>();

    Clip mediaOut = new Clip();

    String mediaPath = mediaIn.path;

    cmd = new ArrayList<String>();

    cmd.add(mFfmpegBin);
    cmd.add("-i");
    cmd.add(mediaPath);

    cmd.add("-b:a");
    cmd.add("128k");

    mediaOut.path = outPath;

    cmd.add(mediaOut.path);

    execFFMPEG(cmd, sc);

    return mediaOut; // this is not importatnt because file will be put in outPath
    }
您需要将函数添加到FfmpegController.java类中。大概是这样的:

public Clip convert (Clip mediaIn, String outPath, ShellCallback sc) throws Exception
{
    ArrayList<String> cmd = new ArrayList<String>();

    cmd.add(mFfmpegBin);
    cmd.add("-y");
    cmd.add("-i");
    cmd.add(new File(mediaIn.path).getCanonicalPath());

    if (mediaIn.startTime != null)
    {
        cmd.add("-ss");
        cmd.add(mediaIn.startTime);
    }
    if (mediaIn.duration != -1)
    {
        cmd.add("-t");
        cmd.add(String.format(Locale.US,"%f",mediaIn.duration));

    }
    Clip mediaOut = new Clip();
    File fileOut = new File(outPath);
    mediaOut.path = fileOut.getCanonicalPath();
    cmd.add(mediaOut.path);
    execFFMPEG(cmd, sc);
    return mediaOut;
}
    public Clip convert(Clip mediaIn, String outPath, ShellCallback sc) throws Exception
    {
    ArrayList<String> cmd = new ArrayList<String>();

    Clip mediaOut = new Clip();

    String mediaPath = mediaIn.path;

    cmd = new ArrayList<String>();

    cmd.add(mFfmpegBin);
    cmd.add("-i");
    cmd.add(mediaPath);

    cmd.add("-b:a");
    cmd.add("128k");

    mediaOut.path = outPath;

    cmd.add(mediaOut.path);

    execFFMPEG(cmd, sc);

    return mediaOut; // this is not importatnt because file will be put in outPath
    }
public Clip convert(Clip mediaIn、字符串输出路径、shell回调sc)引发异常
{
ArrayList cmd=新的ArrayList();
Clip mediaOut=新剪辑();
字符串mediaPath=mediaIn.path;
cmd=newarraylist();
命令添加(mFfmpegBin);
cmd.添加(“-i”);
cmd.add(mediaPath);
命令添加(“-b:a”);
命令添加(“128k”);
mediaOut.path=输出路径;
cmd.add(mediaOut.path);
execFFMPEG(cmd,sc);
return mediaOut;//这不重要,因为文件将放在outPath中
}
现在在您的项目中初始化FfmpegController对象并运行您的函数。

我已经使用了这个项目

它已经为android版本的FFMPEG库编译,该文件将位于res/raw文件夹中(如果需要更新版本,您可以更新该文件)。您需要将此项目作为库添加到您的。之后,您可以用java编写自己的函数,例如:

public Clip convert (Clip mediaIn, String outPath, ShellCallback sc) throws Exception
{
    ArrayList<String> cmd = new ArrayList<String>();

    cmd.add(mFfmpegBin);
    cmd.add("-y");
    cmd.add("-i");
    cmd.add(new File(mediaIn.path).getCanonicalPath());

    if (mediaIn.startTime != null)
    {
        cmd.add("-ss");
        cmd.add(mediaIn.startTime);
    }
    if (mediaIn.duration != -1)
    {
        cmd.add("-t");
        cmd.add(String.format(Locale.US,"%f",mediaIn.duration));

    }
    Clip mediaOut = new Clip();
    File fileOut = new File(outPath);
    mediaOut.path = fileOut.getCanonicalPath();
    cmd.add(mediaOut.path);
    execFFMPEG(cmd, sc);
    return mediaOut;
}
    public Clip convert(Clip mediaIn, String outPath, ShellCallback sc) throws Exception
    {
    ArrayList<String> cmd = new ArrayList<String>();

    Clip mediaOut = new Clip();

    String mediaPath = mediaIn.path;

    cmd = new ArrayList<String>();

    cmd.add(mFfmpegBin);
    cmd.add("-i");
    cmd.add(mediaPath);

    cmd.add("-b:a");
    cmd.add("128k");

    mediaOut.path = outPath;

    cmd.add(mediaOut.path);

    execFFMPEG(cmd, sc);

    return mediaOut; // this is not importatnt because file will be put in outPath
    }
您需要将函数添加到FfmpegController.java类中。大概是这样的:

public Clip convert (Clip mediaIn, String outPath, ShellCallback sc) throws Exception
{
    ArrayList<String> cmd = new ArrayList<String>();

    cmd.add(mFfmpegBin);
    cmd.add("-y");
    cmd.add("-i");
    cmd.add(new File(mediaIn.path).getCanonicalPath());

    if (mediaIn.startTime != null)
    {
        cmd.add("-ss");
        cmd.add(mediaIn.startTime);
    }
    if (mediaIn.duration != -1)
    {
        cmd.add("-t");
        cmd.add(String.format(Locale.US,"%f",mediaIn.duration));

    }
    Clip mediaOut = new Clip();
    File fileOut = new File(outPath);
    mediaOut.path = fileOut.getCanonicalPath();
    cmd.add(mediaOut.path);
    execFFMPEG(cmd, sc);
    return mediaOut;
}
    public Clip convert(Clip mediaIn, String outPath, ShellCallback sc) throws Exception
    {
    ArrayList<String> cmd = new ArrayList<String>();

    Clip mediaOut = new Clip();

    String mediaPath = mediaIn.path;

    cmd = new ArrayList<String>();

    cmd.add(mFfmpegBin);
    cmd.add("-i");
    cmd.add(mediaPath);

    cmd.add("-b:a");
    cmd.add("128k");

    mediaOut.path = outPath;

    cmd.add(mediaOut.path);

    execFFMPEG(cmd, sc);

    return mediaOut; // this is not importatnt because file will be put in outPath
    }
public Clip convert(Clip mediaIn、字符串输出路径、shell回调sc)引发异常
{
ArrayList cmd=新的ArrayList();
Clip mediaOut=新剪辑();
字符串mediaPath=mediaIn.path;
cmd=newarraylist();
命令添加(mFfmpegBin);
cmd.添加(“-i”);
cmd.add(mediaPath);
命令添加(“-b:a”);
命令添加(“128k”);
mediaOut.path=输出路径;
cmd.add(mediaOut.path);
execFFMPEG(cmd,sc);
return mediaOut;//这不重要,因为文件将放在outPath中
}

现在,在您的项目中初始化FfmpegController对象并运行您的函数。

我使用了这个FFmpeg示例,它是在没有NDK的情况下使用的库

第一个下载示例

下载FFmpeg库

在一个文件夹中提取并从Android Studio导入项目

现在,调用FFmpeg命令

此命令用于以90度旋转(/sdcard/videokit/in.mp4)视频,并在SD卡的特定位置生成out.mp4

ffmpeg -y -i /sdcard/videokit/in.mp4 -strict experimental -vf transpose=1 -s 160x120 -r 30 -aspect 4:3 -ab 48000 -ac 2 -ar 22050 -b 2097k /sdcard/videokit/out.mp4
现在使用库中的预定义方法运行此命令,并添加GeneralUtils的侦听器

GeneralUtils.copyLicenseFromAssetsToSDIfNeeded(this, workFolder);
      GeneralUtils.copyDemoVideoFromAssetsToSDIfNeeded(this, demoVideoFolder);
   //demoVideoFolder where your Input file path
   //workFolder Absolute path
   // workFolder = getApplicationContext().getFilesDir().getAbsolutePath() + "/";



            LoadJNI vk = new LoadJNI();
        try {
        
            vk.run(GeneralUtils.utilConvertToComplex(commandStr), workFolder, getApplicationContext());
            
            // copying vk.log (internal native log) to the videokit folder
            GeneralUtils.copyFileToFolder(vkLogPath, demoVideoFolder);
            
        } catch (Throwable e) {
            Log.e(Prefs.TAG, "vk run exeption.", e);
        }

运行此命令并检入文件管理器以获取输出。我希望它能很好地工作:)享受

我使用了这个FFmpeg示例,它是一个没有NDK的库

第一个下载示例

下载FFmpeg库

在一个文件夹中提取并从Android Studio导入项目

现在,调用FFmpeg命令

此命令用于以90度旋转(/sdcard/videokit/in.mp4)视频,并在SD卡的特定位置生成out.mp4

ffmpeg -y -i /sdcard/videokit/in.mp4 -strict experimental -vf transpose=1 -s 160x120 -r 30 -aspect 4:3 -ab 48000 -ac 2 -ar 22050 -b 2097k /sdcard/videokit/out.mp4
现在使用库中的预定义方法运行此命令,并添加GeneralUtils的侦听器

GeneralUtils.copyLicenseFromAssetsToSDIfNeeded(this, workFolder);
      GeneralUtils.copyDemoVideoFromAssetsToSDIfNeeded(this, demoVideoFolder);
   //demoVideoFolder where your Input file path
   //workFolder Absolute path
   // workFolder = getApplicationContext().getFilesDir().getAbsolutePath() + "/";



            LoadJNI vk = new LoadJNI();
        try {
        
            vk.run(GeneralUtils.utilConvertToComplex(commandStr), workFolder, getApplicationContext());
            
            // copying vk.log (internal native log) to the videokit folder
            GeneralUtils.copyFileToFolder(vkLogPath, demoVideoFolder);
            
        } catch (Throwable e) {
            Log.e(Prefs.TAG, "vk run exeption.", e);
        }

运行此命令并检入文件管理器以获取输出。我希望它能很好地工作:)享受

我使用了这个FFmpeg示例,它是一个没有NDK的库

第一个下载示例

下载FFmpeg库

在一个文件夹中提取并从Android Studio导入项目

现在,调用FFmpeg命令

此命令用于以90角度旋转(/sdcard/videokit/in.mp4)视频