提问者:小点点

在Android中从视频(在raw文件夹中)提取音频时出错。 错误:没有这样的文件或目录


我想详细说明我的问题。 我实际上想做的是,我在我的android资源目录的raw文件夹中有一个视频。 现在我想从视频中提取音频,点击一个按钮。 现在我想直接从那个视频中提取音频,而不是先把那个视频保存到我的设备上。 这是我试图实现这一点的代码。

Uri video = Uri.parse("android.resource://" + context.getPackageName() + "/raw/sample3");
//File file = new File(video.toString());
String str = video.toString();
//File file = new File(video.toString());
Log.d("new", "onClick: " + str);
//Log.d("new", "onClick: "+file);

//InputStream stream = context.getResources().openRawResource( R.raw.sample3 );
//String string = stream.toString();

File moviesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);

String filePrefix = "extract_audio";
String fileExtn = ".mp3";
//String yourRealPath = getPath(context, selectedVideoUri);_
File dest = new File(moviesDir, filePrefix + fileExtn);

int fileNo = 0;
while (dest.exists())
{
    fileNo++;
    dest = new File(moviesDir, filePrefix + fileNo + fileExtn);
}
Log.d("str", "startTrim: src: " + video);
Log.d("str", "startTrim: dest: " + dest.getAbsolutePath());
filePath = dest.getAbsolutePath();
try
{
    new AudioExtractor().genVideoUsingMuxer(str, filePath, -1, -1, true, false);
}
catch (IOException e)
{
    e.printStackTrace();
}

这就是我得到的错误。 无法打开文件“Android.content.res.AssetManager$AssetInputStream@5510500”。 (没有这样的文件或目录)

请引导我通过这个。 我犯了什么错误,忽略了什么? 这是剩余的日志猫:

 2020-07-25 17:48:28.254 21653-21653/com.cgfay.caincamera E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.cgfay.caincamera, PID: 21653
java.lang.IllegalArgumentException
    at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:76)
    at com.cgfay.caincamera.utils.AudioExtractor.genVideoUsingMuxer(AudioExtractor.java:72)
    at com.cgfay.caincamera.adapters.HomeAdapter$1.onClick(HomeAdapter.java:140)
    at android.view.View.performClick(View.java:6608)
    at android.view.View.performClickInternal(View.java:6585)
    at android.view.View.access$3100(View.java:785)
    at android.view.View$PerformClick.run(View.java:25921)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:201)
    at android.app.ActivityThread.main(ActivityThread.java:6810)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

这是genVideousingMuxer()方法。

public void genVideoUsingMuxer(String srcPath, String dstPath, int startMs, int endMs, 
        boolean useAudio, boolean useVideo)

共1个答案

匿名用户

现在我想从视频中提取音频,点击一个按钮

在你的开发机器上做这件事,把提取的音频放到你的app里,对你来说会更简单,更高效。 提取的音频对所有用户都是一样的,因为视频对所有用户都是一样的。

现在我想直接从该视频中提取音频,而不是先将该视频保存到我的设备中

在使用InputStream作为视频源的同时,您需要找到一些可以做到这一点的库。 然后,您可以使用resourcesopenrawresource()在您的资源上获取一个inputstream并将其传递到库。

请引导我通过这个。 我犯了什么错误,忽略了什么

您似乎假设URI是文件系统路径(它不是),资源是设备上的文件(它不是)。