2015-09-29 3 views
0

Это следующий вопрос: this question.TextureView с декодером MediaCodec для потоков H264

Это мой 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 или что-нибудь еще?

Заранее благодарен!

+1

Настройка EGL необходима только при рендеринге с помощью GLES. TextureView объединяет SurfaceTexture с пользовательским представлением и делает рендеринг GLES для вас. Именно поэтому View * должен * быть аппаратно ускоренным для TextureView для работы. – fadden

+0

@fadden Спасибо! Итак, мне не нужно настраивать контекст EGL :) Утром я попытался с помощью SurfaceView и установил 'Surface' с помощью' SurfaceHolder.getSurface() 'и нашел тот же результат. Поэтому я думаю, что код, связанный с TextureView, не является проблемой. «Вот почему View должен быть аппаратно ускорен для работы TextureView», - заявил он также на веб-сайте разработчика Android. Означает ли это, что мне нужно установить аппаратное ускорение на 'true' в уровне представления файла манифеста? –

+1

Я думаю, что он включен по умолчанию в последних версиях Android, но вам может потребоваться его явно для старых устройств. См. Http://developer.android.com/guide/topics/graphics/hardware-accel.html – fadden

ответ

0

Моя TextureView реализация в порядке, поскольку я пробовал с SurfaceView тоже и нашел тот же результат. И как @fadden сказал:

Настройка EGL необходима только при рендеринге с помощью GLES. TextureView сочетает в себе SurfaceTexture с пользовательским представлением и делает рендеринг GLES . Именно поэтому для работы TextureView в представлении должен быть аппаратно ускорен .

Благодаря @fadden.

0

В настоящее время я использую TextureView для рендеринга нескольких потоков в одном действии, используя ячейки просмотра коллекции на android (извините за терминологию ios).

Это прекрасно работает, но проблема в том, что вы, например, вращаете устройство, будет поверхность_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 с этими первым, чтобы уменьшить задержку видео рендеринга.

Смежные вопросы