Я пытаюсь использовать команду yt-dlp в своем Java-коде для извлечения аудио из видео на YouTube. По сути, я пытаюсь разработать одно приложение для воспроизведения звука (для лучшего понимания работы с API), в котором я использую API Youtube. Я ищу любую музыку в своем приложении, и она показывает видео с YouTube в списке. На данный момент звук должен быть извлечен из видеороликов YouTube, поскольку я передаю команду в методе updateListView. Он должен возвращать URL-адрес (сохранение в модели), который будет использоваться в других файлах классов для воспроизведения mp3-файлов. Я пробую эту вещь уже больше 1 недели. Я пробовал несколько способов сделать это, но каждый раз получал только одну и ту же ошибку, изображение которой я прикрепил.
private String getAudioUrl(String videoId)
{
File cacheDir = getCacheDir();
File audioDir = new File(cacheDir, "audio");
if (!audioDir.exists())
{
audioDir.mkdirs(); // Create the directory if it doesn't exist
}
try {
ProcessBuilder processBuilder = new ProcessBuilder(
"~/.yt-dlp",
"-x",
"--audio-format", "mp3",
"-P", audioDir.getAbsolutePath() + "/%(title)s.%(ext)s",
"https://www.youtube.com/watch?v = " + videoId
);
Process process = processBuilder.start();
BufferedReader read = new BufferedReader(new InputStreamReader(process.getInputStream()));
String audioUrl = read.readLine();
read.close();
Toast.makeText(MainActivity.this, "Playing!!!", Toast.LENGTH_SHORT).show();
return audioUrl;
} catch (IOException e)
{
e.printStackTrace();
Toast.makeText(MainActivity.this, "Sorry, Error in playing audio!!!", Toast.LENGTH_SHORT).show();
}
return null;
}
Я пытаюсь вызвать этот метод в методе ниже.
private void updateSearchResultsList(List<SearchResult> results)
{
searchResults.clear();
for (SearchResult result : results)
{
String videoTitle = result.getSnippet().getTitle();
String videoImageUrl = result.getSnippet().getThumbnails().getDefault().getUrl();
selectedVideoId = result.getId().getVideoId();
//for testing
// Log.d("Video ID", "Video ID: " + videoId);
String audioUrl = getAudioUrl(selectedVideoId);
YoutubeModel youtubeModel = new YoutubeModel(videoTitle, videoImageUrl, audioUrl);
searchResults.add(youtubeModel);
}
adapter.notifyDataSetChanged();
}//end of method
Ошибка :
java.io.IOException: Cannot run program "~/.yt-dlp": error=2, No such file or directory
2024-05-06 18:19:45.118 24092-24092 System.err com.example.audio_player W at java.lang.ProcessBuilder.start(ProcessBuilder.java:1050)
2024-05-06 18:19:45.118 24092-24092 System.err com.example.audio_player W at com.example.audio_player.Activity.MainActivity.getAudioUrl(MainActivity.java:196)
2024-05-06 18:19:45.118 24092-24092 System.err com.example.audio_player W at com.example.audio_player.Activity.MainActivity.updateSearchResultsList(MainActivity.java:170)
2024-05-06 18:19:45.118 24092-24092 System.err com.example.audio_player W at com.example.audio_player.Activity.MainActivity.access$400(MainActivity.java:31)
2024-05-06 18:19:45.118 24092-24092 System.err com.example.audio_player W at com.example.audio_player.Activity.MainActivity$YouTubeSearchTask.onPostExecute(MainActivity.java:146)
2024-05-06 18:19:45.118 24092-24092 System.err com.example.audio_player W at com.example.audio_player.Activity.MainActivity$YouTubeSearchTask.onPostExecute(MainActivity.java:121)
2024-05-06 18:19:45.118 24092-24092 System.err com.example.audio_player W at android.os.AsyncTask.finish(AsyncTask.java:771)
2024-05-06 18:19:45.118 24092-24092 System.err com.example.audio_player W at android.os.AsyncTask.-$$Nest$mfinish(Unknown Source:0)
2024-05-06 18:19:45.118 24092-24092 System.err com.example.audio_player W at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:788)
2024-05-06 18:19:45.119 24092-24092 System.err com.example.audio_player W at android.os.Handler.dispatchMessage(Handler.java:106)
2024-05-06 18:19:45.119 24092-24092 System.err com.example.audio_player W at android.os.Looper.loopOnce(Looper.java:230)
2024-05-06 18:19:45.119 24092-24092 System.err com.example.audio_player W at android.os.Looper.loop(Looper.java:319)
2024-05-06 18:19:45.119 24092-24092 System.err com.example.audio_player W at android.app.ActivityThread.main(ActivityThread.java:8919)
2024-05-06 18:19:45.119 24092-24092 System.err com.example.audio_player W at java.lang.reflect.Method.invoke(Native Method)
2024-05-06 18:19:45.119 24092-24092 System.err com.example.audio_player W at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578)
2024-05-06 18:19:45.119 24092-24092 System.err com.example.audio_player W at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)
2024-05-06 18:19:45.119 24092-24092 System.err com.example.audio_player W Caused by: java.io.IOException: error=2, No such file or directory
2024-05-06 18:19:45.119 24092-24092 System.err com.example.audio_player W at java.lang.UNIXProcess.forkAndExec(Native Method)
2024-05-06 18:19:45.119 24092-24092 System.err com.example.audio_player W at java.lang.UNIXProcess.<init>(UNIXProcess.java:133)
2024-05-06 18:19:45.120 24092-24092 System.err com.example.audio_player W at java.lang.ProcessImpl.start(ProcessImpl.java:141)
2024-05-06 18:19:45.120 24092-24092 System.err com.example.audio_player W at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
До сих пор я пробовал так много методов, которые я упомянул ниже:
Что еще я могу попытаться извлечь аудио из видео YouTube с помощью команды yt-dlp или есть ли другой способ сделать это???
Я уже пытался установить путь с помощью метода setAbsolutePath, когда пытался запустить свой код с помощью одного из упомянутых репозиториев.




После стольких дней серфинга в Интернете я наконец нашел решение для реализации этой функции. Что ж, согласно моим исследованиям, вы не можете напрямую добавлять код команды в Java-код вашей студии Android. Он будет продолжать выдавать ошибку: yt_dlp: нет такого каталога или каталога, поскольку код не может найти путь к yt_dlp, даже если вы добавите этот .exe-файл yt_dlp в свою папку assest. Простое решение: поскольку yt_dlp — это модуль Python, поэтому мы можем интегрировать наш код Python в нашу студию Android, что разрешено, и мы можем получить тот же результат, что и из командной строки. Для этого нам нужно добавить библиотеку Python в студию Android, которую вы можете получить здесь . Вы также можете получить этот код Python из моего репозитория здесь. Он находится в папке Python. Этот код вернет вам URL-адрес, извлеченный из аудио, который можно использовать в дальнейшем для воспроизведения аудиофайла. Тяжелая работа окупается!!!Продолжайте программировать!
попробуйте использовать абсолютный путь.