2014-10-15 7 views
1

listview의 항목 인 뷰 페이지 내에 비디오 또는 이미지를 표시하려고합니다. 이미지가 올바르게 표시되는 동안 비디오는 비디오없이 소리 만 재생합니다. VideoView와 SurfaceView를 사용해 보았습니다. 나는 이것을 위해 조각을 사용하지 않을 것이다.viewPager 내의 TextureView에 비디오가 없음 (소리 만)

listview에서 테스트 용으로 여러 이미지와 단일 비디오를로드하고 있습니다. 이미지가 잘로드되지만 비디오는 사운드 만 재생합니다.

나는 그것이 surfaceTexture를 올바르게 설정하지 않는 것과 관련이 있다고 생각하지만 그 사실을 이해할 수 없다.

도움이 될 것입니다. 또한

public class MediaSliderPagerAdapter2 extends PagerAdapter { 
    private int forListItem = -1; 
    private LayoutInflater inflater; 
    private MediaPlayer mMediaPlayer; 
    private SurfaceTexture mVideoSurfaceTexture; 

    public MediaSliderPagerAdapter2(int forListItem, LayoutInflater inflater) { 
     super(); 
     this.forListItem = forListItem; 
     this.inflater = inflater; 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     boolean isVideo = false; 
     String url = ""; 

     try { 
      isVideo = mMediaUrls.get(forListItem).get(position).isVideo; 
      url = mMediaUrls.get(forListItem).get(position).url; 
     } 
     catch (Exception e) { 
      Log.e("getUrlType", e.getMessage()); 
     } 

     if(!url.equals("")){ 
      if(isVideo) {     


       final View layoutAll = inflater.inflate(R.layout.fragment_pager_video, container, false); 
       layoutAll.setId(R.id.feedlist_viewpager_layout_id_base + (position+1)*(1000*forListItem+1)); 

       container.addView(layoutAll); 

       final TextureView layout = (TextureView) layoutAll.findViewById(R.id.videoView_layout); 

       mMediaPlayer = new MediaPlayer(); 
       mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 


       layout.setBackgroundResource(android.R.color.transparent); 
       layoutAll.setBackgroundResource(android.R.color.transparent); 

       layout.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { 
        @Override 
        public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 
         Surface s = new Surface(surface); 

         mVideoSurfaceTexture = surface; 

         Log.i("height-width:", height+"-"+width); 
         try { 
          mMediaPlayer.setSurface(s); 
          mMediaPlayer.setDataSource("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"); 
          mMediaPlayer.prepareAsync(); 

          mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
           @Override 
           public void onPrepared(MediaPlayer mp) { 

            MediaController mediaController = new MediaController(mContext); 
            mediaController.setAnchorView(layout); 
            mediaController.setMediaPlayer(new MediaController.MediaPlayerControl() { 
             @Override 
             public void start() { 
              mMediaPlayer.start(); 
             } 
             @Override 
             public void pause() { 
              mMediaPlayer.pause(); 
             } 
             @Override 
             public int getDuration() { 
              return mMediaPlayer.getDuration(); 
             } 
             @Override 
             public int getCurrentPosition() { 
              return mMediaPlayer.getCurrentPosition(); 
             } 
             @Override 
             public void seekTo(int pos) { 
              mMediaPlayer.seekTo(pos); 
             } 
             @Override 
             public boolean isPlaying() { 
              return mMediaPlayer.isPlaying(); 
             } 
             @Override 
             public int getBufferPercentage() { 
              return 0; 
             } 
             @Override 
             public boolean canPause() { 
              return true; 
             } 
             @Override 
             public boolean canSeekBackward() { 
              return true; 
             } 
             @Override 
             public boolean canSeekForward() { 
              return true; 
             } 
             @Override 
             public int getAudioSessionId() { 
              return mMediaPlayer.getAudioSessionId(); 
             } 
            }); 

            mediaController.show(99999); 
            Log.i("VideoView", "Duration = " + mMediaPlayer.getDuration() + " height-width:" + layout.getHeight() + "-" + layout.getWidth()); 

            mMediaPlayer.start(); 
           } 
          }); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 

        @Override 
        public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 
         Log.e("SurfaceSizeChanged", width+"/"+height); 

        } 

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

        @Override 
        public void onSurfaceTextureUpdated(SurfaceTexture surface) { 
         boolean isNull = surface==null; 
         Log.e("onSurfaceTextureUpdated", "isNull: "+ isNull); 
        } 
       }); 



       return layoutAll.getId(); 
      } 
      else { 
       final ImageView layout = (ImageView) inflater.inflate(R.layout.fragment_pager_image, null); 
       layout.setId(R.id.feedlist_viewpager_layout_id_base + (position+1)*(1000*forListItem+1)); 

       layout.setImageBitmap(null); 
       layout.clearAnimation(); 
       Ion.with(mContext) 
         .load(url) 
         .withBitmap() 
         .smartSize(true) 
         .disableFadeIn() 
         .animateIn(R.anim.fade_in_) 
         .error(R.drawable.ic_launcher) 
         .placeholder(R.drawable.loading) 
         .animateLoad(R.anim.spin_animation) 
         .intoImageView(layout); 

       container.addView(layout); 
       return layout.getId(); 
      } 
     } 

     return null; 
    } 



    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     View view = container.findViewById((Integer) object); 

     if(view instanceof ImageView) { 
      ((ImageView) view).setImageBitmap(null); 
      view.clearAnimation(); 
     } 
     else if(view instanceof FrameLayout) { 

     } 

     container.removeView(view); 
    } 

    @Override 
    public int getCount() { 
     int ret = 0; 

     if(mMediaUrls.get(forListItem)!= null) 
      ret = mMediaUrls.get(forListItem).size(); 

     return ret; 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object obj) { 

     boolean isEqual = view.getId() == (Integer) obj; 
     return isEqual; 
    } 




} 

의 XML :

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#0000"> 

    <com.camboindustries.picabet.adapters.SquareTextureView 
     android:id="@+id/videoView_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#0000"> 
    </com.camboindustries.picabet.adapters.SquareTextureView> 

</FrameLayout> 
+0

비디오 재생 코드를 주석 처리하고 캔버스가있는 TextureView에 렌더링하면 아무 것도 보이지 않습니까? 그러면 비디오 렌더링이나 TextureView 디스플레이에 문제가 있는지를 알 수 있습니다. – fadden

답변

0

@fadden : 여기

내 코드 도움을 주셔서 감사합니다,하지만 내 SquareTextureView 사용자 정의보기에 문제가 밝혀졌다 :

나는이로 된 onMeasure 기능을 변경했다 :

@Override 
protected void onMeasure(int width, int height) { 
    super.onMeasure(width, height); 
    int measuredWidth = getMeasuredWidth(); 
    setMeasuredDimension(measuredWidth, measuredWidth); 
} 

나는 이것이 문제의 근원이라고 생각한다.

나는 같은 수정과 SquareFrameLayout 사용자 정의보기를 생성하고 그 일이 왜 누군가가 답을 알고 있다면 우리가 뭔가를 배울 수있는 의견을 주시기 바랍니다 (확실하지 않다 ...

지금은 괜찮습니다 이걸로 다행 이네요.)