簡體   English   中英

Runtime.getRuntime().exec(command) - 無法運行程序,錯誤=2,沒有那個文件或目錄

[英]Runtime.getRuntime().exec(command) - Cannot run program, error=2, No such file or directory

我想在 ffmpeg 的幫助下獲得視頻時長:

String command = "ffmpeg -i /home/user/Videos/my-video.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d ,"
Runtime.getRuntime().exec(cmdarray);

但我總是得到 java.io.IOException: 無法運行程序 "ffmpeg -i /home/user/Videos/my-video.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d ,":錯誤=2,沒有那個文件或目錄

如果我從終端運行此命令 - 一切正常

你這里有幾個問題。 首先,正如@joy 指出的那樣,Java 用來定位命令的路徑可能存在問題,因此 Java 可能找​​不到名為“ffmpeg”的命令。 修復用於啟動 VM 的路徑應該可以解決這個問題,或者只是將完全限定的路徑名​​插入到“ffmpeg”中。

其次:您正在嘗試運行終端/shell 命令。 “|” 管道通常由終端/外殼正確解釋,該終端/外殼將鏈分解為鏈接標准輸出/標准輸入的子進程。 但是 Java 被要求運行“ffmpeg”,傳入一些包含“|”的參數 “ffmpeg”不會按照您的意願處理。

檢查您使用的外殼:

echo $SHELL

假設打印的/bin/bash - 您可以通過讓 Java 啟動 shell 並使其解釋管道命令來修復:

String[] command = new String[] { "/bin/bash", "-c", "ffmpeg -i /home/user/Videos/my-video.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d ," };
Runtime.getRuntime().exec(cmdarray);

從終端運行與從 Java 運行時,路徑很可能不同。 1.您可以嘗試使用ffmpeg的完整路徑(在終端中運行“which ffmpeg”)。 2. 也許 ffmpeg 是 .profile 文件中的別名,在這種情況下,您可以嘗試在 Java 中執行命令之前先獲取(加載)您的 .profile 文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM