我正在处理两个单声道wav文件,我想将它们另存为立体声文件。 每个单声道的流式传输和订阅如下。 单声道数据可以具有不同的长度。 我使用zip运算符来处理对。 问题是我必须打电话:
fileWriter.stopRecord();
当完成两个数据的处理时。 所以我想用zip onCompleted方法来完成它,但是它不起作用,因为 处理完一个单声道后(调用onCompleted),它将调用zip onCompleted,但另一个单声道仍在处理中。 那么,如何确保在处理两个单声道之后调用zip onCompleted?一对值可以为null没关系。
Observable<HermesMessages.AudioChunk> speakerAudioObservable = this.channel.getSpeakerAudio();
speakerAudioObservable.subscribe(
sample -> {
log.trace("Processing speaker !!!" );
},
error -> {
log.error("Error during writing to file", error);
}, () -> {
log.trace("Completed writing speaker audio to file.");
});
Observable<HermesMessages.AudioChunk> dronAudioObservable = channel.getDronAudio();
dronAudioObservable.subscribe(
sample -> {
log.trace("Processing dron !!!" );
},
error -> {
log.error("Error during writing to file", error);
},
() -> {
log.trace("Completed writing dron audio to file.");
});
Observable.zip(speakerAudioObservable, dronAudioObservable, Pair::create)
.subscribe(
pair -> {
fileWriter.streamSecData(pair.first().getContent());
fileWriter.workerJob();
fileWriter.streamData(pair.second().getContent());
fileWriter.workerJob();
},
error -> {
log.error("zip Error during writing to file", error);
fileWriter.stopRecord();
}, () -> {
log.trace("zip Completed writing speaker audio to file.");
fileWriter.stopRecord();
});
答案 0 :(得分:0)
您无法使用zip来执行此操作,因为当压缩的一个可观察对象之一完成发射项目时,流就结束了。 (来源:http://reactivex.io/documentation/operators/zip.html)。
但是您可以使用另一个名为CombineLatest的运算符。它将一个可观察对象发射的一个项目与另一个可观察对象发射的最后一个项目组合在一起。缺点是您必须检查某个项目是否已经被“处理”(已经从该项目创建了一个配对)。因此,您必须更改Pair::create
方法。也无需单独订阅每个可观察的对象。
来源:http://reactivex.io/documentation/operators/combinelatest.html
答案 1 :(得分:0)
我已经对一些整数进行了简单的解决方案测试 希望这个解决方案对您有帮助 2个大小不相同的整数流
public void run(String... args) throws Exception {
Observable<Integer> integerObservable1 = Observable.just(1, 2, 3,4);
Observable<Integer> integerObservable2 = Observable.just(1, 2);
runObservable(integerObservable1, integerObservable2)
.map(o -> {
System.out.println(o);
return o;
}).subscribe();
}
private Observable<Object> runObservable(Observable<Integer> integerObservable1, Observable<Integer> integerObservable2) {
return Observable.merge(
Observable.zip(integerObservable1, integerObservable2, (BiFunction<Integer, Integer, Object>) (integer, integer2) -> integer + " " + integer2),
Single.zip(integerObservable1.toList(), integerObservable2.toList(), (integers, integers2) -> Math.min(integers.size(), integers2.size()))
.flatMapObservable(integer -> Observable.merge(integerObservable1.skip(integer), integerObservable2.skip(integer)))
.map(integer -> integer + " " + "static value")
);
}
代码输出:
1 1
2 2
3静态值
4个静态值
由于流1有2个元素,流2有4个元素,我将其保留为静态,因为rxjava不支持null,但是您可以选择静态值可以为null还是最后一个值