Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java gstreamer快速转码_Java_Clojure_Mp3_Gstreamer_Amr - Fatal编程技术网

Java gstreamer快速转码

Java gstreamer快速转码,java,clojure,mp3,gstreamer,amr,Java,Clojure,Mp3,Gstreamer,Amr,编辑使用解决方案更新代码 我需要将amr转换成mp3,所以我用GStreamerJava编写了一个gstreamer管道。看起来是这样的: src ! amrparse ! amrnbdec ! lamemp3enc ! sink (当然,实际上是用JavaAPI构建的),我从 Bus.connect(EOS, fn(){Gst.quit();}); setState(PLAYING); Gst.main(); 它工作正常,但所需时间等于音频长度,这是不可接受的。 等价物 gst-lau

编辑
使用解决方案更新代码

我需要将amr转换成mp3,所以我用GStreamerJava编写了一个gstreamer管道。看起来是这样的:

src ! amrparse ! amrnbdec ! lamemp3enc ! sink 
(当然,实际上是用JavaAPI构建的),我从

Bus.connect(EOS, fn(){Gst.quit();});

setState(PLAYING);
Gst.main();
它工作正常,但所需时间等于音频长度,这是不可接受的。 等价物

gst-launch 
以机器速度转码

那么,我需要如何设置管道,以获得机器速度转码

这是完整的资料来源,供能熟练使用clojure的人参考

(ns audio
  (:import [org.gstreamer Gst Pipeline Bin Element ElementFactory State
                          StateChangeReturn Bus$EOS Bus$ERROR Bus$STATE_CHANGED]
    [org.gstreamer.io InputStreamSrc OutputStreamSink]
    [java.io InputStream OutputStream])
 (:use clojure.contrib.logging))

(Gst/init)
(defn transcode [^InputStream in ^OutputStream out]
  (let [id (gensym (quote transcode))
        src (InputStreamSrc. in (str "in stream " id))
        dec0 (ElementFactory/make "amrparse" (str "amr parser " id))
        dec1 (ElementFactory/make "amrnbdec" (str "amr decoder " id))
        enc (doto (ElementFactory/make "lamemp3enc" (str "mp3 encoder " id))
               (.set "mono" true)
               (.set "target" 0)
               (.set "quality" 2))
        out (doto (OutputStreamSink. out (str "out stream " id))
               (.setSync false))
        pipe (doto (Pipeline. (str "transcoder pipe " id))
                (.add src)
                (.add dec0)
                (.add dec1)
                (.add enc)
                (.add out))
        clean (fn []
                (.setState src nil)
                (.setState dec0 nil)
                (.setState dec1 nil)
                (.setState enc nil)
                (.setState out nil)
                (.setState pipe nil))]
    (prn "starting transcode " id)
    (.link src dec0)
    (.link dec0 dec1)
    (.link dec1 enc)
    (.link enc out)

    (doto (.getBus pipe)
      (.connect 
        (reify Bus$EOS
          (endOfStream [this src]
            (prn "Bus finished " src)
            (clean)
            (Gst/quit))))
      (.connect
        (reify Bus$ERROR
          (errorMessage [this src code msg]
          (prn "Bus Error " src code msg)
          (clean)
          (Gst/quit))))
      (.connect 
        (reify Bus$STATE_CHANGED
          (stateChanged [this src old now pending]
          (prn "Bus State change " src old now pending)))))
    (.setState pipe State/PLAYING)
    (Gst/main)))

请尝试
.setSync(false)
获取您的输出。在普通的gstreamer中,同步流试图跟踪时间,而异步流则以尽可能快的速度运行。也许您的输出流正在尝试实时工作。

完美!这正是我要找的。现在我可以还原Shell脚本hack:)非常感谢!你能告诉我在哪里可以查到这些信息吗?为什么只有输出流阻塞,而不是输入流或管道本身?输出通常设置整个管道的速率(声卡)。无论出于何种原因,Java绑定都将其设置为true,可能是因为它是一个通用io流,不一定是一个文件,而是
gst-launch!filesink
将快速运行,同步自动为false。除了猜测gst inspect属性的用途之外,我不知道在哪里可以找到这个。