如何在单个gstreamer管道中编码/解码实时音频?

时间:2015-12-07 16:29:53

标签: gstreamer

为了测试,我想构建一个对实时音频进行编码然后解码的管道。我尝试过使用mp3或aac编码,如果源是非实时的,我当然可以这样做:

public class ToDoListFragment extends Fragment {

private RecyclerView mToDoListRecyclerView;
private ToDoAdapter mAdapter;
private EditText mTitleEditText;
private ToDo mToDo;
private Button mAddButton;
private Button mDeleteButton;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_to_do_list, container, false);

    mTitleEditText = (EditText) view.findViewById(R.id.editText_toDo);
    mAddButton = (Button) view.findViewById(R.id.addButton_toDo);
    mDeleteButton = (Button) view.findViewById(R.id.deleteButton_toDo);

    mAddButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            mToDo = new ToDo();
            mToDo.setTitle(mTitleEditText.getText().toString());
            ToDoListLab.get(getActivity()).addToDo(mToDo);
            mAdapter.notifyDataSetChanged();
        }
    });

    /*mDeleteButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (mToDo.isSolved() == true){

                ToDoListLab.get(getActivity()).removeToDo(mToDo);
                mAdapter.notifyDataSetChanged();
            }
        }
    });*/

    mToDoListRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view_toDo);
    mToDoListRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    updateUI();

    return view;
}

private void updateUI() {
    ToDoListLab ToDoLab = ToDoListLab.get(getActivity());
    List<ToDo> toDo = ToDoLab.getToDo();
    mAdapter = new ToDoAdapter(toDo);
    mToDoListRecyclerView.setAdapter(mAdapter);
}

private class ToDoHolder extends RecyclerView.ViewHolder{

    private ToDo mToDo;
    private TextView mTitleTextView;
    private CheckBox mSolvedCheckBox;

    public ToDoHolder (View itemView){

        super(itemView);
        mTitleTextView = (TextView) itemView.findViewById(R.id.textview_toDo);
        mSolvedCheckBox = (CheckBox) itemView.findViewById(R.id.checkbox_toDo);
        /*mSolvedCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                mToDo.setSolved(isChecked);
            }
        });*/
    }

    public void bindToDo(ToDo toDo){

        mToDo = toDo;
        mTitleTextView.setText(mToDo.getTitle());
        mSolvedCheckBox.setChecked(mToDo.isSolved());

    }
}

private class ToDoAdapter extends RecyclerView.Adapter<ToDoHolder>{

    private List<ToDo> mToDos;

    public ToDoAdapter(List<ToDo> toDos){

        mToDos = toDos;
    }

    @Override
    public ToDoHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
        View view = layoutInflater.inflate(R.layout.list_item_to_do, parent, false);

        return new ToDoHolder(view);
    }

    @Override
    public void onBindViewHolder(ToDoHolder holder, int position) {
        ToDo toDo = mToDos.get(position);
        holder.bindToDo(toDo);
    }

    @Override
    public int getItemCount() {
        return mToDos.size();
    }
}
}

在上述情况下,管道构建完毕,我可以听到播放的音频。但是,如果源是实时的,则管道无法播放,但没有播放音频。

我确定我错过了一些关键概念,但看不到什么!

1 个答案:

答案 0 :(得分:0)

它可能是您使用的实时源导致问题吗?它可能有额外的延迟,导致音频接收器丢弃所有样本。

这条管道怎么样:

$ gst-launch-1.0 audiotestsrc is-live=true ! faac ! aacparse ! faad ! autoaudiosink

这里的audiotestsrc就好像它是一个实时源。另请注意,建议在编码器元素之后添加解析器。所以&#34; aacparse&#34;对于AAC音频和&#34; mpegaudioparse&#34;用于MP3音频。

相关问题