使用mediacodec选择视频,解码,更改其fps,编码和保存

时间:2018-06-09 15:00:13

标签: android video encoding decoding mediacodec

想要从设备中挑选视频并对其进行解码,以便更改其帧速率,然后进行编码并将其保存到设备中。如何使用MediaCodec实现这一目标?经历了许多文档,但找不到方法。我有以下代码进行解码。这对我的目的是否有益。如果是,如何使用该解码数据以更改的fps保存它。

public class RecordsAdapter extends RecyclerView.Adapter<RecordsAdapter.RecordViewHolder> {

private Context mCtx;
private List<Record> recordList;

public RecordsAdapter(Context mCtx, List<Record> recordList) {
    this.mCtx = mCtx;
    this.recordList = recordList;
}

@NonNull
@Override
public RecordViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(mCtx);
    View view = inflater.inflate(R.layout.record_logs_card, null);
    return new RecordViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull RecordViewHolder holder, int position) {

    Record record = recordList.get(position);
    holder.date.setText(record.getDate());
    holder.qty.setText(String.valueOf(record.getQty()));
    holder.rate.setText(String.valueOf(record.getRate()));
    holder.total.setText(String.valueOf(record.getTotal()));
}

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

class RecordViewHolder extends RecyclerView.ViewHolder {

    TextView date, qty, rate, total;


    public RecordViewHolder(View itemView) {
        super(itemView);

        date = itemView.findViewById(R.id.date);
        qty = itemView.findViewById(R.id.qty);
        rate = itemView.findViewById(R.id.rate);
        total = itemView.findViewById(R.id.total);
    }
}

1 个答案:

答案 0 :(得分:2)

您可以查看Vue.set,这是使用曲面进行解码和重新编码的绝佳起点(解码器的输出曲面 - >编码器的输入曲面)。

特别注意这个方法

private void editVideoData(VideoChunks inputData, MediaCodec decoder,
            OutputSurface outputSurface, InputSurface inputSurface, MediaCodec encoder,
            VideoChunks outputData)

您必须遵循的工作流程类似于以下:

  • 提取视频片段(MediaExtractor)

  • 输入解码器输入缓冲区

  • 将解码后的帧渲染到表面

  • 渲染时,编码器将获取帧(您还必须设置时间戳)
  • 使用MediaMuxer将编码器帧与音频轨道复用。

额外链接:一些示例

DecodeEditEncode

ExtractDecodeEditEncodeMuxTest(非常有趣)