2

나는 사용자가 영화를 시작하기 위해 화면을 터치하는 앱에서 작업 해왔다. 화면 이미지는 영화의 첫 번째 프레임입니다. 터치가 발생하면 영화가 재생됩니다. 나는 영화 앞에서 첫 번째 프레임의 jpg를 놓은 다음 영화가 재생되고 있다고 생각하면 jpg를 제거하여이 작업을 수행합니다. (그 일이 언제 일어날 지 파악하는 것은 불가능하지만 또 다른 문제입니다. 오래된 장치에서는 너무 빨리 이미지를 제거하면 검정이됩니다.)Kindle Fire HD : 영화가 jpgs보다 밝음

아마도 6 개의 다른 장치에서이를 테스트했습니다. 오늘 일곱 ​​번째 : 킨들 파이어 HD. 이 장치에서 영화는 모두 해당 jpg보다 밝습니다. 다른 모든 장치에서는 완벽하게 일치합니다. 어떤 아이디어로 인해이 문제가 발생하거나 수정 될 수 있습니까?

(. HD의 또 다른 문제는 영화가 재생을 시작하기 위해 정말 오랜 시간이 걸릴하지만 그건 또 다른 문제라는 것이다.)

편집 : 여기

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
    <ImageView 
     android:id="@+id/iv" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 
    <VideoView 
     android:id="@+id/vv" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 
</FrameLayout> 

과 : 여기 내 main.xml에있다 코드 :

public class VideoTestActivity extends Activity implements SurfaceHolder.Callback, OnPreparedListener, OnCompletionListener { 
private VideoView vv; 
private ImageView iv; 
private Bitmap b; 
private MediaPlayer mp = new MediaPlayer(); 
private static final String TAG = VideoTestActivity.class.getSimpleName(); 
private volatile boolean prepared = false; 
private volatile boolean readytoplay = false; 
private volatile boolean playing = false; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setContentView(R.layout.main); 
    iv = (ImageView)findViewById(R.id.iv); 
    iv.bringToFront(); 
    vv = (VideoView)findViewById(R.id.vv); 
    b = BitmapFactory.decodeResource(getResources(), R.drawable.babyblack); 
    iv.setBackgroundColor(0xFFDFA679); 
    vv.getHolder().addCallback(this); 
    mp.setOnPreparedListener(this); 
    mp.setOnCompletionListener(this); 
    try { 
     mp.setDataSource(this, Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.ape)); 
    } catch (IllegalArgumentException e) { 
     Log.d(TAG,"illegal argument exception on set data source"); 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     Log.d(TAG,"security exception on set data source"); 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     Log.d(TAG,"illegal state exception on set data source"); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     Log.d(TAG,"IO exception on set data source"); 
     e.printStackTrace(); 
    } 

} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    float dx, dy; 
    Log.d(TAG,"touch event"); 
    if (!playing && event.getAction() == MotionEvent.ACTION_UP) { 
     Log.d(TAG,"action up"); 
     if (prepared) { 
      playing = true; 
      Log.d(TAG,"hardware accelerated: iv="+iv.isHardwareAccelerated()+", vv="+vv.isHardwareAccelerated()); 
      mp.start(); 
      Log.d(TAG, "playing video in onTouch callback"); 
      Log.d(TAG,"hardware accelerated: iv="+iv.isHardwareAccelerated()+", vv="+vv.isHardwareAccelerated()); 
     } else 
      readytoplay = true; 
    } 
    return true; 
} 

@Override 
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    Log.d(TAG,"surface is created"); 
    mp.setDisplay(vv.getHolder()); 
    try { 
     mp.prepareAsync(); 
    } catch (IllegalArgumentException e) { 
     Log.d(TAG,"illegal argument exception on prepare"); 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     Log.d(TAG,"security exception on prepare"); 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     Log.d(TAG,"illegal state exception on prepare"); 
     e.printStackTrace(); 
    } 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
} 

@Override 
public void onPrepared(MediaPlayer mp) { 
    Log.d(TAG,"video is prepared"); 
    prepared = true; 
    if (readytoplay) { 
     playing = true; 
     mp.start(); 
     iv.setVisibility(View.GONE); 
     Log.d(TAG,"playing video from prepared callback"); 
    } 
} 

@Override 
public void onCompletion(MediaPlayer arg0) { 
    Log.d(TAG,"video is done"); 
    playing = false; 
    iv.setVisibility(View.VISIBLE); 
}} 

ImageView는 이미지가 없지만 단색의 배경으로 변경되었습니다. 필요한 데이터 파일은 mp4 영화뿐입니다. 화면을 터치하면 동영상이 재생되고 ImageView 뒤에 숨겨집니다. 만질 때 화면이 즉시 밝아지고 (mp.start()가 발생 함) 영화가 재생되기 시작하고 점차 약간 흐려진 다음 다시 밝아지고 영화가 끝나면 마침내 안정화됩니다.

하드웨어 가속을 시도했지만 하드웨어 가속을 사용하지 않았습니다. 차이 없음. 나는 킨들 파이어 HD를 꽂으려고했지만 플러그를 꽂지 않았다. 차이 없음.

2 초짜리 mp4 파일을 게시 하겠지만 사용 방법은 모르겠습니다.

+1

공유 할 수있는 샘플이 있습니까? 나는이 문제를 포스터와 함께 내장 된 html5 비디오를 사용하여 보지 못했지만, videoView와 오버레이 된 이미지로 시도하지는 않았다. 그것이 인공물을 일으키는 오버레이인지 궁금합니다. 비디오 절반에 이미지 오버레이를 시도 했습니까 (그렇지 않은 경우와 그렇지 않은 경우의 차이가 있는지 확인하기 위해)? – Offbeatmammal

+0

@Offbeatmammal - 그냥 시도하고 아니. mp.start()가 호출 되 자마자 전체 화면이 밝아지고 동영상이 완료되면 희미 해집니다. 영화를 볼 수 없더라도 (jpg로 감춰져 있기 때문에) 화면이 밝아집니다. 그래서 화면 밝기 매개 변수가 조정되고있는 것처럼 보입니다. 그러나 밝기를 항상 위로 돌렸고 여전히 발생합니다. 매우 당혹 스럽네. 실험을 계속할 것입니다. 그리고 예, 함께 행동을 취할 수 있다면 샘플 코드가 좋을 것입니다. – SeaRisk

+0

하드웨어 가속과 관련이있을 수 있습니까? 이 가설을 시험하려하지만 어떻게해야할지 모릅니다. 마치 영화 플레이어를 시작하면 화면이 렌더링되는 방식이 변경됩니다 (동영상 플레이어와 관련이없는 화면 부분 포함). – SeaRisk

답변

관련 문제