Jak odtwarzać wiele plików wideo jednocześnie w jednym układzie obok siebie w innym widoku w Androidzie

W Androidzie stworzyłem układ z trzema powierzchniowymi widokami obok siebie i chcę odtwarzać jeden plik wideo z innym odtwarzaczem multimedialnym jednocześnie. Ale napotkałem jeden problem, że żaden z trzech nie może odtwarzać tego wideo jednocześnie. Jeden lub dwóch z nich zatrzymało wyświetlacz. Jeśli użyłem widoku wideo zamiast klasy Media Player bezpośrednio, ale problem pozostaje taki sam. Proszę, każdy może pomóc. Po co ten problem? Daje błąd tworzenia powierzchni błąd natywny. Próbowałem różne kombinacje, takie jak jeden plik w 3 różnych widoku, trzy pliki w trzech różnych widoku, ale problem nie został jeszcze rozwiązany. Niektóre odpowiedzi na innej stronie internetowej mówią, że to zależy od wersji jądra. Jeśli zależy to od wersji jądra, proszę, czy możesz dać mi dowolny link do dokumentacji Androida na stronie Androida, który zależy od wersji jądra. Lub jest to możliwe, aby grać, proszę podać mi kroki kodu. To jest dziennik błędów -

04-10 19:23:37.995: E/ANDROID_DRM_TEST(2573): Client::notify In
04-10 19:23:37.995: V/AudioPolicyManager(2573): startOutput() output 1, stream 3,  session 131
04-10 19:23:37.995: V/AudioPolicyManager(2573): getDeviceForStrategy() from cache strategy 0, device 2
04-10 19:23:37.995: V/AudioPolicyManager(2573): getNewDevice() selected device 2
04-10 19:23:37.995: V/AudioPolicyManager(2573): setOutputDevice() output 1 device 2 delayMs 0
04-10 19:23:37.995: V/AudioPolicyManager(2573): setOutputDevice() setting same device 2 or null device for output 1
04-10 19:23:37.995: I/AudioFlinger(2573): start output streamType (0, 3) for 1
04-10 19:23:37.995: D/AudioHardwareYamaha(2573): AudioStreamOut::setParameters(keyValuePairs="start_output_streamtype=3")
04-10 19:23:38.010: W/SEC_Overlay(2689): overlay_setPosition(0) 0,0,200,397 => 0,0,200,397
04-10 19:23:38.010: I/SEC_Overlay(2689): overlay_setParameter param[4]=4
04-10 19:23:38.010: D/SEC_Overlay(2689): dst width, height have changed [w= 200, h= 397] -> [w=200, h= 397]
04-10 19:23:38.010: I/SEC_Overlay(2689): Nothing to do!
04-10 19:23:38.090: E/VideoMIO(2573): AndroidSurfaceOutput::setParametersSync()  VIDEO ROTATION 0
04-10 19:23:38.090: E/VideoMIO(2573): AndroidSurfaceOutput::setParametersSync()  VIDEO RENDERER 1
04-10 19:23:38.090: D/SEC_Overlay(2689): overlay_createOverlay:IN w=128 h=96 format=48
04-10 19:23:38.090: E/SEC_Overlay(2689): Error - overlays already in use
04-10 19:23:38.090: D/VideoMIO(2573): Overlay create failed - retrying
04-10 19:23:38.195: D/SEC_Overlay(2689): overlay_createOverlay:IN w=128 h=96 format=48
04-10 19:23:38.195: E/SEC_Overlay(2689): Error - overlays already in use
04-10 19:23:38.195: D/VideoMIO(2573): Overlay create failed - retrying
04-10 19:23:38.230: E/VideoMIO(2573): AndroidSurfaceOutput::setParametersSync()  VIDEO ROTATION 0
04-10 19:23:38.230: E/VideoMIO(2573): AndroidSurfaceOutput::setParametersSync()  VIDEO RENDERER 1
04-10 19:23:38.230: D/SEC_Overlay(2689): overlay_createOverlay:IN w=128 h=96 format=48
04-10 19:23:38.230: E/SEC_Overlay(2689): Error - overlays already in use
04-10 19:23:38.230: D/VideoMIO(2573): Overlay create failed - retrying
04-10 19:23:38.295: D/SEC_Overlay(2689): overlay_createOverlay:IN w=128 h=96 format=48
04-10 19:23:38.295: E/SEC_Overlay(2689): Error - overlays already in use
04-10 19:23:38.295: D/VideoMIO(2573): Overlay create failed - retrying
04-10 19:23:38.330: D/SEC_Overlay(2689): overlay_createOverlay:IN w=128 h=96 format=48
04-10 19:23:38.330: E/SEC_Overlay(2689): Error - overlays already in use
04-10 19:23:38.330: D/VideoMIO(2573): Overlay create failed - retrying
04-10 19:23:38.395: D/SEC_Overlay(2689): overlay_createOverlay:IN w=128 h=96 format=48
04-10 19:23:38.395: E/SEC_Overlay(2689): Error - overlays already in use
04-10 19:23:38.395: D/VideoMIO(2573): Overlay create failed - retrying
04-10 19:23:38.435: D/SEC_Overlay(2689): overlay_createOverlay:IN w=128 h=96 format=48
04-10 19:23:38.435: E/SEC_Overlay(2689): Error - overlays already in use
04-10 19:23:38.435: D/VideoMIO(2573): Overlay create failed - retrying
04-10 19:23:38.495: D/SEC_Overlay(2689): overlay_createOverlay:IN w=128 h=96 format=48
04-10 19:23:38.495: E/SEC_Overlay(2689): Error - overlays already in use
04-10 19:23:38.495: D/VideoMIO(2573): Overlay create failed - retrying
04-10 19:23:38.535: D/SEC_Overlay(2689): overlay_createOverlay:IN w=128 h=96 format=48
Author: Suvam Roy, 2012-03-23

5 answers

Nie podajesz zbyt wielu szczegółów na temat tego, co dokładnie próbowałeś i jakie są problematyczne obszary, więc zrobiłem mały test, aby zobaczyć, czy mogę odtworzyć cokolwiek z tego, co opisujesz.

Nie mam żadnych rozstrzygających ustaleń, ale mogę przynajmniej potwierdzić, że mój Galaxy Nexus (Android 4.0.2) jest w stanie odtwarzać trzy filmy jednocześnie bez żadnych problemów. Z drugiej strony stary Samsung Galaxy Spica (Android 2.1-update1), który leżał tylko gra jeden file at a time - it seems to always be the first SurfaceView.

Zbadałem dalej różne poziomy API, konfigurując emulatory dla Androida 3.0, 2.3.3 i 2.2. Wszystkie te platformy wydają się być w stanie obsłużyć odtwarzanie wielu plików wideo na różnych widokach powierzchni. Zrobiłem jeden ostatni test z emulatorem działającym 2.1-update1 też, który co ciekawe również grał test case bez problemów, w przeciwieństwie do rzeczywistego telefonu. Zauważyłem niewielkie różnice w sposobie układ został jednak renderowany.

To zachowanie prowadzi mnie do podejrzeń, że tak naprawdę nie ma żadnych ograniczeń programowych do tego, czego szukasz, ale wydaje się, że zależy to od sprzętu, w którym obsługiwane jest jednoczesne odtwarzanie wielu plików wideo. Stąd wsparcie dla tego scenariusza będzie się różnić w zależności od urządzenia. Z empirycznego punktu widzenia, zdecydowanie myślę, że byłoby interesujące przetestowanie tej hipotezy na niektórych bardziej fizycznych urządzeniach.

Tylko dla odniesienia niektóre szczegóły z uwagi do realizacji:

  1. skonfigurowałem dwie nieco różne implementacje: jedną opartą na trzech instancjach MediaPlayer W Jednym Activity, i jedną, w której zostały one podzielone na trzy oddzielne fragmenty z każdym własnym obiektem MediaPlayer. (Przy okazji nie znalazłem żadnych różnic w odtwarzaniu dla tych dwóch implementacji)
  2. pojedynczy plik 3gp (Dzięki za to, Apple), znajdujący się w folderze assets, został użyty do odtwarzania ze wszystkimi odtwarzaczami.
  3. The kod dla obu implementacji jest załączony poniżej i w dużej mierze oparty na Googlach MediaPlayerDemo_Video przykładowa implementacja - usunąłem trochę kodu nie wymaganego do rzeczywistego testowania. Wynik w żadnym wypadku nie jest kompletny ani odpowiedni do użycia w aplikacjach na żywo.

Wdrożenie oparte na aktywności:

public class MultipleVideoPlayActivity extends Activity implements
    OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback {

    private static final String TAG = "MediaPlayer";
    private static final int[] SURFACE_RES_IDS = { R.id.video_1_surfaceview, R.id.video_2_surfaceview, R.id.video_3_surfaceview };

    private MediaPlayer[] mMediaPlayers = new MediaPlayer[SURFACE_RES_IDS.length];
    private SurfaceView[] mSurfaceViews = new SurfaceView[SURFACE_RES_IDS.length];
    private SurfaceHolder[] mSurfaceHolders = new SurfaceHolder[SURFACE_RES_IDS.length];
    private boolean[] mSizeKnown = new boolean[SURFACE_RES_IDS.length];
    private boolean[] mVideoReady = new boolean[SURFACE_RES_IDS.length];

    @Override public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.multi_videos_layout);

        // create surface holders
        for (int i=0; i<mSurfaceViews.length; i++) {
            mSurfaceViews[i] = (SurfaceView) findViewById(SURFACE_RES_IDS[i]);
            mSurfaceHolders[i] = mSurfaceViews[i].getHolder();
            mSurfaceHolders[i].addCallback(this);
            mSurfaceHolders[i].setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }
    }

    public void onBufferingUpdate(MediaPlayer player, int percent) {
        Log.d(TAG, "MediaPlayer(" + indexOf(player) + "): onBufferingUpdate percent: " + percent);
    }

    public void onCompletion(MediaPlayer player) {
        Log.d(TAG, "MediaPlayer(" + indexOf(player) + "): onCompletion called");
    }

    public void onVideoSizeChanged(MediaPlayer player, int width, int height) {
        Log.v(TAG, "MediaPlayer(" + indexOf(player) + "): onVideoSizeChanged called");
        if (width == 0 || height == 0) {
            Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")");
            return;
        }

        int index = indexOf(player);
        if (index == -1) return; // sanity check; should never happen
        mSizeKnown[index] = true;
        if (mVideoReady[index] && mSizeKnown[index]) {
            startVideoPlayback(player);
        }
    }

    public void onPrepared(MediaPlayer player) {
        Log.d(TAG, "MediaPlayer(" + indexOf(player) + "): onPrepared called");

        int index = indexOf(player);
        if (index == -1) return; // sanity check; should never happen
        mVideoReady[index] = true;
        if (mVideoReady[index] && mSizeKnown[index]) {
            startVideoPlayback(player);
        }
    }

    public void surfaceChanged(SurfaceHolder holder, int i, int j, int k) {
        Log.d(TAG, "SurfaceHolder(" + indexOf(holder) + "): surfaceChanged called");
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.d(TAG, "SurfaceHolder(" + indexOf(holder) + "): surfaceDestroyed called");
    }


    public void surfaceCreated(SurfaceHolder holder) {
        Log.d(TAG, "SurfaceHolder(" + indexOf(holder) + "): surfaceCreated called");

        int index = indexOf(holder);
        if (index == -1) return; // sanity check; should never happen
        try { 
            mMediaPlayers[index] = new MediaPlayer();
            AssetFileDescriptor afd = getAssets().openFd("sample.3gp");
            mMediaPlayers[index].setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
            mMediaPlayers[index].setDisplay(mSurfaceHolders[index]);
            mMediaPlayers[index].prepare();
            mMediaPlayers[index].setOnBufferingUpdateListener(this);
            mMediaPlayers[index].setOnCompletionListener(this);
            mMediaPlayers[index].setOnPreparedListener(this);
            mMediaPlayers[index].setOnVideoSizeChangedListener(this);
            mMediaPlayers[index].setAudioStreamType(AudioManager.STREAM_MUSIC);
        }
        catch (Exception e) { e.printStackTrace(); }
    }

    @Override protected void onPause() {
        super.onPause();
        releaseMediaPlayers();
    }

    @Override protected void onDestroy() {
        super.onDestroy();
        releaseMediaPlayers();
    }

    private void releaseMediaPlayers() {
        for (int i=0; i<mMediaPlayers.length; i++) {
            if (mMediaPlayers[i] != null) {
                mMediaPlayers[i].release();
                mMediaPlayers[i] = null;
            }
        }
    }


    private void startVideoPlayback(MediaPlayer player) {
        Log.v(TAG, "MediaPlayer(" + indexOf(player) + "): startVideoPlayback");
        player.start();
    }

    private int indexOf(MediaPlayer player) {
        for (int i=0; i<mMediaPlayers.length; i++) if (mMediaPlayers[i] == player) return i;
        return -1;  
    }

    private int indexOf(SurfaceHolder holder) {
        for (int i=0; i<mSurfaceHolders.length; i++) if (mSurfaceHolders[i] == holder) return i;
        return -1;  
    }
}

R. layout.multi_videos_layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:orientation="vertical">

    <SurfaceView android:id="@+id/video_1_surfaceview"
        android:layout_width="fill_parent" android:layout_height="0dp"
        android:layout_weight="1" />

    <SurfaceView android:id="@+id/video_2_surfaceview"
        android:layout_width="fill_parent" android:layout_height="0dp"
        android:layout_weight="1" />

    <SurfaceView android:id="@+id/video_3_surfaceview"
        android:layout_width="fill_parent" android:layout_height="0dp"
        android:layout_weight="1" />

</LinearLayout>

Oparte na fragmentach realizacja:

public class MultipleVideoPlayFragmentActivity extends FragmentActivity {

    private static final String TAG = "MediaPlayer";

    @Override public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.multi_videos_activity_layout);
    }

    public static class VideoFragment extends Fragment implements
        OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback {

        private MediaPlayer mMediaPlayer;
        private SurfaceView mSurfaceView;
        private SurfaceHolder mSurfaceHolder;
        private boolean mSizeKnown;
        private boolean mVideoReady;

        @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(R.layout.multi_videos_fragment_layout, container, false);
        }

        @Override public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            mSurfaceView = (SurfaceView) getView().findViewById(R.id.video_surfaceview);
            mSurfaceHolder = mSurfaceView.getHolder();
            mSurfaceHolder.addCallback(this);
            mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }

        public void onBufferingUpdate(MediaPlayer player, int percent) {
            Log.d(TAG, "onBufferingUpdate percent: " + percent);
        }

        public void onCompletion(MediaPlayer player) {
            Log.d(TAG, "onCompletion called");
        }

        public void onVideoSizeChanged(MediaPlayer player, int width, int height) {
            Log.v(TAG, "onVideoSizeChanged called");
            if (width == 0 || height == 0) {
                Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")");
                return;
            }

            mSizeKnown = true;
            if (mVideoReady && mSizeKnown) {
                startVideoPlayback();
            }
        }

        public void onPrepared(MediaPlayer player) {
            Log.d(TAG, "onPrepared called");

            mVideoReady = true;
            if (mVideoReady && mSizeKnown) {
                startVideoPlayback();
            }
        }

        public void surfaceChanged(SurfaceHolder holder, int i, int j, int k) {
            Log.d(TAG, "surfaceChanged called");
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
            Log.d(TAG, "surfaceDestroyed called");
        }

        public void surfaceCreated(SurfaceHolder holder) {
            Log.d(TAG, "surfaceCreated called");

            try { 
                mMediaPlayer = new MediaPlayer();
                AssetFileDescriptor afd = getActivity().getAssets().openFd("sample.3gp");
                mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
                mMediaPlayer.setDisplay(mSurfaceHolder);
                mMediaPlayer.prepare();
                mMediaPlayer.setOnBufferingUpdateListener(this);
                mMediaPlayer.setOnCompletionListener(this);
                mMediaPlayer.setOnPreparedListener(this);
                mMediaPlayer.setOnVideoSizeChangedListener(this);
                mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            }
            catch (Exception e) { e.printStackTrace(); }
        }

        @Override public void onPause() {
            super.onPause();
            releaseMediaPlayer();
        }

        @Override public void onDestroy() {
            super.onDestroy();
            releaseMediaPlayer();
        }

        private void releaseMediaPlayer() {
            if (mMediaPlayer != null) {
                mMediaPlayer.release();
                mMediaPlayer = null;
            }
        }

        private void startVideoPlayback() {
            Log.v(TAG, "startVideoPlayback");
            mMediaPlayer.start();
        }
    }
}

R. layout.multi_videos_activity_layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:orientation="vertical">

    <fragment class="mh.so.video.MultipleVideoPlayFragmentActivity$VideoFragment"
        android:id="@+id/video_1_fragment" android:layout_width="fill_parent"
        android:layout_height="0dp" android:layout_weight="1" />

    <fragment class="mh.so.video.MultipleVideoPlayFragmentActivity$VideoFragment"
        android:id="@+id/video_2_fragment" android:layout_width="fill_parent"
        android:layout_height="0dp" android:layout_weight="1" />

    <fragment class="mh.so.video.MultipleVideoPlayFragmentActivity$VideoFragment"
        android:id="@+id/video_3_fragment" android:layout_width="fill_parent"
        android:layout_height="0dp" android:layout_weight="1" />

</LinearLayout>

R. layout.multi_videos_fragment_layout:

<?xml version="1.0" encoding="utf-8"?>
<SurfaceView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/video_surfaceview" android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

Update: Chociaż istnieje już od jakiegoś czasu, pomyślałem, że warto zwrócić uwagę, że projekt Grafika Google prezentuje'double decode' funkcja, która"dekoduje dwa strumienie wideo jednocześnie do dwóch przeglądów tekstowych.". Nie wiem, jak dobrze skaluje do więcej niż dwóch plików wideo, ale mimo to istotne dla pierwotnego pytania.

 33
Author: MH.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-23 07:24:39

/ Align = "center" bgcolor = "# e0ffe0 " / cesarz chin / / align = center / ...

video1=(VideoView)findViewById(R.id.myvideoview);
    video1.setVideoURI(Uri.parse("android.resource://" +getPackageName()+ "/"+R.raw.sample));
    video1.setMediaController(new MediaController(this));
    video1.requestFocus();
video2=(VideoView)findViewById(R.id.myvideview);
video2.setVideoURI(Uri.parse("android.resource://" +getPackageName()+ "/"+R.raw.sample1));
video2.setMediaController(new MediaController(this));
video2.requestFocus();

Thread view1=new Thread(new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_DISPLAY);
        video1.start();
    }
});

Thread view2=new Thread(new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_DISPLAY);
        video2.start();
    }
});

Ale to zależy od ur urządzenia h / W pogoda obsługuje multi video-view lub nie. Jeśli nie obsługuje, spowoduje to błąd jako This video can not be played Error (1, -110)

 5
Author: Rohit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-16 10:52:40

Znalazłem jedno rozwiązanie. Wystarczy wymienić / system / build.prop z poniższą kompilacją.prop -

Zbuduj.prop
# begin build properties
# autogenerated by buildinfo.sh
ro.build.id=GINGERBREAD
ro.build.display.id=GINGERBREAD.EG14
ro.build.version.incremental=EG14
ro.build.version.sdk=10
ro.build.version.codename=REL
ro.build.version.release=2.3.4
ro.build.date=Thu Jul 14 12:16:01 KST 2011
ro.build.date.utc=1310613361
ro.build.type=user
ro.build.user=se.infra
ro.build.host=SEI-28
ro.build.tags=release-keys
ro.product.model=SHW-M250S
ro.product.brand=samsung
ro.product.name=SHW-M250S
ro.product.device=SHW-M250S
ro.product.board=SHW-M250S
ro.product.cpu.abi=armeabi-v7a
# Samsung Specific Properties
ro.build.PDA=M250S.EG14.1208
ro.build.hidden_ver=M250S.EG14.1208
ro.b uild.changelist=380592
ro.product.cpu.abi2=armeabi
ro.product.manufacturer=samsung
ro.product.locale.language=ko
ro.product.locale.region=KR
ro.wifi.channels=
ro.board.platform=s5pc210
# ro.build.product is obsolete; use ro.product.device
ro.build.product=SHW-M250S
# Do not try to parse ro.build.description or .fingerprint
ro.build.description=SHW-M250S-user 2.3.4 GINGERBREAD EG14 release-keys
ro.build.fingerprint=samsung/SHW-M250S/SHW-M250S:2.3.4/GINGERBREAD/EG14:user/release-keys
# Samsung Specific Properties
ro.build.PDA=M250S.EG14.1208
ro.build.hidden_ver=M250S.EG14.1208
ro.build.changelist=380592
ro.build.fota_ver=SSNT11GINGEREG14
ro.tether.denied=false
ro.flash.resolution=1080
# end build properties
#
# system.prop for asop5000
#

rild.libpath=/system/lib/libsec-ril.so
rild.libargs=-d /dev/ttyS0
ro.sf.lcd_density=240
dalvik.vm.heapsize=64m

# Samsung USB default mode
persist.service.usb.setting=2

#
# ADDITIONAL_BUILD_PROPERTIES
#
ro.setupwizard.mode=OPTIONAL
ro.com.google.gmsversion=2.3_r4
media.stagefright.enable-player=true
media.stagefright.enable-meta=true
media.stagefright.enable-scan=true
media.stagefright.enable-http=true
media.stagefright.enable-rtsp=true
ro.com.google.clientidbase=android-samsung
ro.com.google.clientidbase.ms=android-skt-kr
ro.com.google.clientidbase.am=android-skt-kr
ro.com.google.clientidbase.gmm=android-samsung
ro.com.google.clientidbase.yt=android-samsung
ro.url.legal=http://www.google.com/intl/%s/mobile/android/basic/phone-legal.html
ro.url.legal.android_privacy=http://www.google.com/intl/%s/mobile/android/basic/privacy.html
ro.com.google.locationfeatures=1
keyguard.no_require_sim=true
ro.config.ringtone=Over_the_horizon.ogg
ro.config.notification_sound=Sherbet.ogg
ro.config.alarm_alert=Good_Morning.ogg
ro.config.media_sound=Over_the_horizon.ogg
ro.opengles.version=131072
ro.csc.sales_code=MSK
ro.secdevenc=true
ro.wtldatapassword=true
net.bt.name=Android
dalvik.vm.stack-trace-file=/data/anr/traces.txt

Najpierw podłącz swój Samsung Galaxy S-II Za Pomocą usb i wpisz Wiersz polecenia, aby zamontować system -

cmd:> adb remount

A następnie zastąp plik i uruchom ponownie urządzenie -

cmd:> adb shell
#reboot

Zauważyłem, że domyślnie to urządzenie używa frameworka opencore zamiast libstagefright. A opencore ma jakiś problem, dlatego błąd nawowy rzuca. Ale libstagefright jest już zaimplementowany w Androidzie w wersji 2.3. Spójrz na budowę.plik prop, stagefright jest wyłączony. Jest to najlepsze rozwiązanie, aby umożliwić libstagefright framework i wspierać libstagefright framework. Możesz również odtwarzać plik MPEG-2TS i obsługuje odtwarzanie wielu plików wideo jednocześnie bez żadnego problemu. Spróbuj i ciesz się.

 1
Author: Suvam Roy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-20 11:57:53

Nie podajesz żadnych przykładów kodu.

Z mojego doświadczenia wynika, że można to zrobić z fragmentami (przynajmniej na urządzeniach, z których korzystałem). Pamiętaj, że istnieje Biblioteka obsługi fragmentów dla starszych urządzeń.

Więc zasadniczo umieścić LinearLayout lub coś w miejsce VideoViews, a następnie użyć transakcji Fragment zastąpić LinearLayouts Fragment, który ma VideoView.

 0
Author: Tyler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-13 20:27:30

Spróbuj tego

public class CustomPictureActivity extends Activity {
/** Called when the activity is first created. */
VideoView vd1,vd2;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    vd1=(VideoView) findViewById(R.id.v1);
    vd2=(VideoView) findViewById(R.id.v2);
    vd1.setVideoURI(Uri.parse("/mnt/sdcard/file.mp4"));
    vd1.setMediaController(new MediaController(this));
    vd1.requestFocus();
    vd1.start();

    vd2.setVideoURI(Uri.parse("/mnt/sdcard/android.mp4"));
    vd2.setMediaController(new MediaController(this));
    vd2.requestFocus();
    vd2.start();
}

}

I xml powinien wyglądać tak

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >

<VideoView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="0.5" 
    android:id="@+id/v1"/>

<VideoView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="0.5" 
    android:id="@+id/v2"/>

</LinearLayout>
 0
Author: Tofeeq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-17 09:47:52