2016-09-28 12 views
10

पर वीडियो चलाते समय मुझे एंड्रॉइड MediaPlayer कक्षा के साथ एक अजीब समस्या का सामना करना पड़ रहा है। मैं VideoView में वीडियो चलाने के लिए मीडियाप्लेयर का उपयोग कर रहा हूं। एंड्रॉइड 4.2.2 के साथ सैमसंग जीटी-आई 8200 एन को छोड़कर यह सभी उपकरणों पर अच्छी तरह से काम करता है। खैर, मैंने वास्तव में रिपोर्टों को सुना है कि वीडियो कुछ सैमसंग 4.1.एक्स डिवाइस पर नहीं खेलेंगे, लेकिन मैं इन उपकरणों में से किसी एक पर हाथ नहीं ले पा रहा था। मुझे Google एंड्रॉइड अनुकरणकर्ताओं में कोई त्रुटि नहीं है।एंड्रॉइड मीडियाप्लेयर फ़्लिकर एंड्रॉइड 4.2.2

कुछ और विवरण: एंड्रॉइड 4.2.2 के साथ सैमसंग जीटी-आई 8200 एन एक टुकड़े में वीडियो चलाने में सक्षम है, लेकिन दूसरे में नहीं, भले ही एक ही कोड वीडियो चलाने के लिए उपयोग किया जाता है। जब वीडियो पूरी स्क्रीन फ्लिकर्स ब्लैक शुरू कर रहा है, उस स्थान को छोड़कर जहां वीडियो होना चाहिए।

D/v_gal(115): [tid=275] gcmVERIFY_ARGUMENT failed:

D/v_gal(115): [tid=275] gcmONERROR: status=-1(gcvSTATUS_INVALID_ARGUMENT) @ _Blit(2208)

E/v_hwc(115): Failed in _Blit: status=-1

D/v_gal(115): [tid=275] gcmONERROR: status=-1(gcvSTATUS_INVALID_ARGUMENT) @ hwcComposeG2D(615)

E/v_hwc(115): Failed in hwcComposeG2D: status=-1

E/v_hwc(115): _Set(1007): Compose failed


पूर्ण logcat उत्पादन यहां पाया जा सकता:

public abstract class AbstractSignVideoFragment extends Fragment { 

private static final double MAXMIMUM_VIDEO_HEIGHT_ON_LANDSCAPE = 0.4; 
private static final double MAXIMUM_VIDEO_WIDTH_ON_PORTRAIT = 0.8; 
private final static String TAG = AbstractSignVideoFragment.class.getSimpleName(); 
private static final String ANDROID_RESOURCE = "android.resource://"; 
private static final String SLASH = "/"; 
private static final String RAW = "raw"; 
protected VideoView videoView; 
protected ProgressBar progressBar; 

@SuppressWarnings("BooleanMethodIsAlwaysInverted") 
protected boolean isSetupVideoViewSuccessful(final Sign sign, final SOUND sound, final CONTROLS controls) { 
    initializeMediaController(); 
    final String mainActivityPackageName = getActivity().getPackageName(); 
    final int signIdentifier = getActivity().getResources().getIdentifier(sign.getName(), RAW, mainActivityPackageName); 
    if (0 == signIdentifier) { 
     return false; 
    } 
    final Uri uri = Uri.parse(ANDROID_RESOURCE + mainActivityPackageName + SLASH + signIdentifier); 
    if (!isVideoViewDimensionSetToMatchVideoMetadata(this.videoView, uri)) { 
     return false; 
    } 
    this.videoView.setVideoURI(uri); 
    this.videoView.requestFocus(); 
    this.videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     public void onPrepared(MediaPlayer mp) { 
      AbstractSignVideoFragment.this.progressBar.setVisibility(View.GONE); 
      if (sound.equals(SOUND.OFF)) { 
       mp.setVolume(0f, 0f); 
      } 
      AbstractSignVideoFragment.this.videoView.start(); 
      AbstractSignVideoFragment.this.videoView.setContentDescription(getActivity() 
        .getString(R.string.videoIsPlaying) + ": " + sign.getName()); 
      Log.d(TAG, String.format("Actual width: %s, Actual height: %s", 
        AbstractSignVideoFragment.this.videoView.getWidth(), 
        AbstractSignVideoFragment.this.videoView.getHeight())); 
      // Set the MediaController to null so the controls are not 'popping up' 
      // when the video plays for the first time. 
      AbstractSignVideoFragment.this.videoView.setMediaController(null); 
     } 
    }); 
    this.videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mp) { 
      if (controls.equals(CONTROLS.SHOW)) { 
       initializeMediaController(); 
      } 
     } 
    }); 
    return true; 
} 

private void initializeMediaController() { 
    final MediaController mediaController = new MediaController(getActivity(), false); 
    mediaController.setAnchorView(this.videoView); 
    this.videoView.setMediaController(mediaController); 
} 

private boolean isVideoViewDimensionSetToMatchVideoMetadata(VideoView videoView, Uri uri) { 
    String metadataVideoWidth; 
    String metadataVideoHeight; 
    try { 
     final MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever(); 
     metaRetriever.setDataSource(getActivity(), uri); 
     metadataVideoWidth = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); 
     metadataVideoHeight = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); 
     metaRetriever.release(); 
     Validate.notEmpty(metadataVideoWidth); 
     Validate.notEmpty(metadataVideoHeight); 
    } catch (NullPointerException | IllegalArgumentException ex) { 
     return false; 
    } 
    final double videoWidth = Double.valueOf(metadataVideoWidth); 
    final double videoHeight = Double.valueOf(metadataVideoHeight); 
    final double videoRatio = videoWidth/videoHeight; 
    Log.d(TAG, String.format("videoWidth: %s, videoHeight: %s, videoRatio: %s", videoWidth, videoHeight, videoRatio)); 
    boolean isOrientationPortrait = Configuration.ORIENTATION_PORTRAIT == getResources().getConfiguration().orientation; 
    int displayHeight = getResources().getDisplayMetrics().heightPixels; 
    int displayWidth = getResources().getDisplayMetrics().widthPixels; 
    Log.d(TAG, String.format("displayHeight: %s, displayWidth: %s", displayHeight, displayWidth)); 
    final double desiredVideoWidth, desiredVideoHeight; 
    if (isOrientationPortrait) { 
     desiredVideoWidth = displayWidth * MAXIMUM_VIDEO_WIDTH_ON_PORTRAIT; 
     desiredVideoHeight = 1/(videoRatio/desiredVideoWidth); 
     Log.d(TAG, String.format("OrientationPortrait: desiredVideoWidth: %s, desiredVideoHeight: %s", desiredVideoWidth, desiredVideoHeight)); 
    } else { // orientation is Landscape 
     desiredVideoHeight = displayHeight * MAXMIMUM_VIDEO_HEIGHT_ON_LANDSCAPE; 
     desiredVideoWidth = desiredVideoHeight * videoRatio; 
     Log.d(TAG, String.format("OrientationLandscape: desiredVideoWidth: %s, desiredVideoHeight: %s", desiredVideoWidth, desiredVideoHeight)); 
    } 
    final ViewGroup.LayoutParams layoutParams = videoView.getLayoutParams(); 
    layoutParams.width = (int) desiredVideoWidth; 
    layoutParams.height = (int) desiredVideoHeight; 
    return true; 
} 

public enum SOUND {ON, OFF} 

public enum CONTROLS {SHOW, HIDE} 
} 

यहाँ logcat उत्पादन जो लूप जब स्क्रीन flickrs है:

यहाँ कोड है Github issue (full logcat)

वीडियो दृश्य कोड:

< VideoView 
android:id="@+id/signTrainerVideoView" 
android:layout_width="0dip" 
android:layout_height="0dip" 
android:layout_below="@+id/signTrainerQuestionText" 
android:layout_centerHorizontal="true" /> 


टुकड़ा का पूरा लेआउट एक्सएमएल यहां पाया जा सकता है: layout xml (full fragment)

+0

उम ... VideoView वास्तव में पुराना विजेट है। क्या आपने TextureView के साथ यह प्रयास किया है [link] (http://stackoverflow.com/questions/10736517/playing-video-on-textureview) –

उत्तर

0

मैं अगर इस समस्या का समाधान होगा की अनिश्चित हूँ, लेकिन मैं सिर्फ रिपोर्ट करेंगे वहाँ में improvable लगता है क्या।

आदेश में अपने VideoView आकार यथार्य करने के लिए:

final ViewGroup.LayoutParams layoutParams = videoView.getLayoutParams(); 
layoutParams.width = (int) desiredVideoWidth; 
layoutParams.height = (int) desiredVideoHeight; 
videoView.setLayoutParams(layoutParams); // Input Changes 
videoView.getHolder().setSizeFromLayout(); // Apply Changes 

प्लस मैं क्या प्रयोग से, "0dip" आकार कंप्यूटिंग वजन पैरामीटर, प्रदान करता है लगता है नहीं करता है, जिसके साथ निकलता है। गलत हो सकता है लेकिन उल्लेख करने लायक है।

// Add android:weightSum="1" to the sup. Layout 
// And set a weight there 
<VideoView 
      android:id="@+id/signTrainerVideoView" 
      android:layout_width="0dip" 
      android:layout_height="0dip" 
      android:layout_weight="1" 
      android:layout_below="@+id/signTrainerQuestionText" 
      android:layout_centerHorizontal="true" /> 
+0

उत्तर के लिए Thx। मैं इसे एप की जांच करने की कोशिश करूंगा। – ScarOnTheSky

संबंधित मुद्दे