Вы можете сделать это с помощью ffmpeg
с помощью фильтра amerge
:
ffmpeg -i input1.mp3 -i input2.mp3 -filter_complex amerge -ac 2 -c:a libmp3lame -q:a 4 output.mp3
-ac 2
сделает стереофонический выход. Это полезно, если вы объединяете два стерео входа: amerge будет производить 4-канальный выход, а -ac 2
будет микшировать его до стерео. -q:v
(качество звука), которое вы можете захотеть. Это потому, что вы пытаетесь удалить некоторые элементы с List.remove(position)
последовательно. Вы, вероятно, удаляете ту же позицию элемента с помощью следующего кода:
asset_type.remove(position);
asset_count.remove(position);
asset_value.remove(position);
AssetDetailsActivity.assetValueId.remove(position);
AssetDetailsActivity.assetCountId.remove(position);
AssetDetailsActivity.assetTypeId.remove(position);
Источником проблемы обычно является то, что вы забыли, что не примитивный тип данных всегда передается ссылка, например: а List
.
В следующем типичном адаптере RecylerView список (List<YourDatum> data
) передается по ссылке:
public class YourAdapter extends
RecyclerView.Adapter<YourAdapter.ViewHolder> {
..
private List<YourDatum> mData;
public YourAdapter(List<YourDatum> data) {
mData = data;
}
}
и мы обычно передаем список через конструктор с помощью:
[112 ] Итак, и YourActivity.mData
, и YourAdapter.mData
указывают на одно и то же место. Следовательно, всякий раз, когда вы удаляете элемент из YourActivity.mData
, элемент YourAdapter.mData
также удаляется.
Теперь вам нужно использовать только следующий код для вашего дела:
asset_type.remove(position);
asset_count.remove(position);
asset_value.remove(position);
// the following is not needed because it's incorrect
// AssetDetailsActivity.assetValueId.remove(position);
// AssetDetailsActivity.assetCountId.remove(position);
// AssetDetailsActivity.assetTypeId.remove(position)