<p>只要文件格式相同(.wav或.mp3),下面的Vala代码就可以工作。在</p>
<pre><code>using Gst;
public class AudioFileSource : Gst.Bin {
string filename;
Gst.Caps outcaps;
Gst.Element filesrc;
Gst.Element dbin;
Gst.Element ident;
Gst.Element audioconvert;
Gst.Element volume;
/**
* AudioFileSource - creates an input source Bin from a filename
* @param filename: The name of the audio file to load.
* @param volume: Volume level (fractional, may go above 1.0)
* @param outcaps: Optional GStreamer capabilities object. A sensible
default will be used if not given.
*/
public AudioFileSource (string filename, double volume = 0.5, Gst.Caps? outcaps = null) {
this.filename = filename;
if (outcaps == null)
this.outcaps = Gst.Caps.from_string("audio/x-raw,format=int,channels=2,rate=44100,depth=16");
else
this.outcaps = outcaps;
filesrc = Gst.ElementFactory.make("filesrc", "src");
filesrc.set("location", this.filename);
dbin = Gst.ElementFactory.make("decodebin", null);
ident = Gst.ElementFactory.make("identity", null);
audioconvert = Gst.ElementFactory.make("audioconvert", null);
this.volume = Gst.ElementFactory.make("volume", null);
this.volume.set_property("volume", volume);
add_many(filesrc, dbin, ident, audioconvert, this.volume);
filesrc.link(dbin);
audioconvert.link(this.volume);
this.volume.link_filtered(ident, outcaps);
// Create an output from this bin (the "src" of the ident instance
// becomes the the "src" of this bin)
var srcpad = new Gst.GhostPad("src", ident.get_static_pad("src"));
add_pad(srcpad);
dbin.pad_added.connect((e, p) => {
p.link(audioconvert.get_static_pad("sink"));
});
}
}
public class SimpleMixer : GLib.Object {
/*
Simple class that mixes audio sources straight over the top of each other.
*/
Gst.Pipeline pipeline;
Gst.Element mixer;
Gst.Element audioconvert;
Gst.Element sink;
AudioFileSource[] sources = {};
public signal void finished();
public SimpleMixer () {
pipeline = new Gst.Pipeline("mypipeline");
mixer = Gst.ElementFactory.make("adder", null);
}
public void stop(Message msg) {
if (msg.type == Gst.MessageType.EOS) {
pipeline.set_state(Gst.State.NULL);
finished();
}
}
public void add_source (string filename) {
sources += new AudioFileSource(filename);
}
public void mix (string output) {
audioconvert = Gst.ElementFactory.make("wavenc", null);
sink = Gst.ElementFactory.make("filesink", "sink");
sink.set("location", output);
foreach (var source in sources)
pipeline.add(source);
pipeline.add(mixer);
foreach (var source in sources)
source.get_static_pad("src").link(mixer.get_request_pad("sink_%u"));
pipeline.add(audioconvert);
mixer.link(audioconvert);
pipeline.add(sink);
audioconvert.link(sink);
var bus = pipeline.get_bus();
bus.add_signal_watch(GLib.Priority.HIGH);
bus.message.connect(stop);
pipeline.set_state(Gst.State.PLAYING);
}
}
static int main(string[] args) {
Gst.init(ref args);
var mainloop = new MainLoop();
var mixer = new SimpleMixer();
for (int i = 2; i < args.length; i++)
mixer.add_source (args[i]);
mixer.finished.connect(() => {
mainloop.quit();
});
mixer.mix(args[1]);
mainloop.run();
return 0;
}
</code></pre>
<p>您应该使用gstreamer-1.0编译它:</p>
^{pr2}$
<p>要使用它:</p>
<pre><code>./mixer totalfinal.wav file1.wav file2.wav
</code></pre>
<p>希望这能帮你开始。在</p>