1

这是这个问题的后续问题。

这是我的TextureView代码:

public class VideoTextureView extends TextureView implements SurfaceTextureListener{

    private static final String LOG_TAG = VideoTextureView.class.getSimpleName();
    private MediaCodecDecoder mMediaDecoder;
    private MediaCodecAsyncDecoder mMediaAsyncDecoder;

    public VideoTextureView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setSurfaceTextureListener(this);
        Log.d(LOG_TAG, "Video texture created.");
    }

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        Log.d(LOG_TAG, "Surface Available: " + width + " x " + height);
        mMediaDecoder = new MediaCodecDecoder();
        mMediaDecoder.Start();
        mMediaDecoder.SetSurface(new Surface(getSurfaceTexture()));
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
        mMediaDecoder.Stop();
        return false;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
        // TODO Auto-generated method stub

    }

}

我的问题 - 我的TextureView实现是否可以渲染由解码的 H264 流MediaCodec?还是我需要进行 EGL 设置或其他任何事情?

提前致谢!

4

2 回答 2

1

我的TextureView实现还可以,因为我也尝试SurfaceView过并发现了相同的结果。正如@fadden 所说——

仅当您使用 GLES 进行渲染时,才需要设置 EGL。TextureView 将 SurfaceTexture 与自定义 View 相结合,并为您进行 GLES 渲染。这就是为什么 View 必须经过硬件加速才能使 TextureView 工作。

感谢@fadden。

于 2015-10-23T04:08:35.053 回答
0

我目前正在使用 TextureView 使用 android 上的集合视图单元格在一个活动中渲染多个流(抱歉,这里有 ios 术语)。

它工作正常,但问题是,例如当您旋转设备时,将会有surface_destroyed,然后是surface_available。如我所见,您正确地停止并启动了解码器。

我在解码器中做的一件事是:

List<NaluSegment> segments = NaluParser.parseNaluSegments(buffer);
        for (NaluSegment segment : segments) {
            // ignore unspecified NAL units.
            if (segment.getType() != NaluType.UNSPECIFIED) {

                // Hold the parameter set for stop/start initialization speed
                if (segment.getType() == NaluType.PPS) {
                    lastParameterSet[0] = segment;
                } else if (segment.getType() == NaluType.SPS) {
                    lastParameterSet[1] = segment;
                } else if (segment.getType() == NaluType.CODED_SLICE_IDR) {
                    lastParameterSet[2] = segment;
                }

                // add to input queue
                naluSegmentQueue.add(segment);
            }
        }

我保留最后一个参数集和最后一个关键帧,并在开始时用这些首先填充 naluSegmentQueue 以减少视频渲染的延迟。

于 2015-09-29T13:21:15.987 回答