无法在Wowza GoCoder的PlayerActivity中播放视频

问题描述 投票:1回答:1

我在尝试调用WowZa GoCoder SDK的PlayerActivity时遇到错误,我无法理解原因。调用mStreamPlayerView.play(mStreamPlayerConfig,statusCallback)时出现错误。真的很感谢我在哪里出错了

VOD fragment.Java

public class vodFragment extends Fragment {


    private int mColumnCount = 1;
    ListView videoView;
    ArrayList <Vidoes> videoList;
    private static String value;
    String videoName;

    String url = "http://192.168.43.149/twende/channelVOD.php";

    public vodFragment() {
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        if (getActivity().getActionBar() != null) {
            getActivity().getActionBar().setTitle(value);
        }


        View view = inflater.inflate(R.layout.fragment_vod_list, container, false);
        videoView = (ListView) view.findViewById(R.id.listView);
        videoList = new ArrayList<Vidoes>();
        JSONObject channelInfo = new JSONObject();
        try {
            channelInfo.put("channelName", value);
            channelInfo.put("channelOwner", "dan");

            postJSONObject(url,channelInfo);


        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        return view;
    }

    public static void setChannel(String channel){
       value = channel;
    }


    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
    }

    @Override
    public void onDetach() {
        super.onDetach();
    }

    public void postJSONObject(final String myurl, final JSONObject parameters) {

        class postJSONObject extends AsyncTask<Void, Void, String> {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);

                try {

                    loadIntoVodView(s);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            protected String doInBackground(Void... voids) {

                HttpURLConnection conn = null;
                try {
                    StringBuffer response = null;
                    URL url = new URL(myurl);
                    conn = (HttpURLConnection) url.openConnection();
                    conn.setReadTimeout(10000);
                    conn.setConnectTimeout(15000);
                    conn.setRequestProperty("Content-Type", "application/json");
                    conn.setDoOutput(true);
                    conn.setRequestMethod("POST");
                    OutputStream out = new BufferedOutputStream(conn.getOutputStream());
                    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));
                    writer.write(parameters.toString());
                    writer.close();
                    out.close();
                    int responseCode = conn.getResponseCode();
                    System.out.println("responseCode" + responseCode);
                    switch (responseCode) {
                        case 200:
                            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                            String inputLine;
                            response = new StringBuffer();
                            while ((inputLine = in.readLine()) != null) {
                                response.append(inputLine);
                            }
                            in.close();
                            return response.toString();
                    }
                } catch (IOException ex) {
                    ex.printStackTrace();
                } finally {
                    if (conn != null) {
                        try {
                            conn.disconnect();
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }
                }
                return null;

            }
        }

        postJSONObject postJSONObject = new postJSONObject();
        postJSONObject.execute();
    }

    private void loadIntoVodView(String json) throws JSONException {
        JSONArray jsonArray = new JSONArray(json);
        final String[]  videos = new String[jsonArray.length()];
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject obj = jsonArray.getJSONObject(i);
            videos[i] = removeExtension(obj.getString("title"));

            Vidoes vidoe = new Vidoes();

            vidoe.setTitle(videos[i]);

            videoList.add(vidoe);
        }

        VideoListAdapter adapter = new VideoListAdapter(getActivity(), R.layout.vodparsedata, videoList);
        videoView.setAdapter(adapter);



        videoView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1,
                                    int position, long arg3) {

                videoName = Arrays.asList(videos).get(position);

                Intent intent = new Intent(getActivity(), PlayerActivity.class);
                String message = videoName+".mp4";
                intent.putExtra("videoName", message);
                startActivity(intent);

                System.out.println("arr: " + Arrays.asList(videos).get(position));


            }


        });
    }

    public static String removeExtension(String fileName) {

        if (fileName.indexOf(".") > 0) {

            return fileName.substring(0, fileName.lastIndexOf("."));

        } else {

            return fileName;

        }



    }

}

player activity.Java

public class PlayerActivity extends GoCoderSDKActivityBase {
    final private static String TAG = PlayerActivity.class.getSimpleName();
    String videoName;

    private WOWZPlayerView mStreamPlayerView = null;
    private WOWZPlayerConfig mStreamPlayerConfig = new WOWZPlayerConfig();


    private MultiStateButton    mBtnPlayStream   = null;
    private MultiStateButton    mBtnSettings     = null;
    private MultiStateButton    mBtnMic          = null;
    private MultiStateButton    mBtnScale        = null;
    private SeekBar             mSeekVolume      = null;
    private ProgressDialog      mBufferingDialog = null;

    private StatusView        mStatusView       = null;
    private TextView          mHelp             = null;
    private TimerView         mTimerView        = null;
    private ImageButton       mStreamMetadata   = null;
    private boolean           mUseHLSPlayback   = false;
    private WOWZPlayerView.PacketThresholdChangeListener packetChangeListener = null;
    private VolumeChangeObserver mVolumeSettingChangeObserver = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_stream_player);

        mRequiredPermissions = new String[]{};

        if (savedInstanceState == null) {
            Bundle extras = getIntent().getExtras();
            if(extras == null) {
                videoName= null;
            } else {
                videoName= extras.getString("videoName");
            }
        } else {
            videoName= (String) savedInstanceState.getSerializable("videoName");
        }

        System.out.print(videoName);

        mStreamPlayerConfig.setIsPlayback(true);
        mStreamPlayerConfig.setHostAddress("192.168.43.149");
        mStreamPlayerConfig.setApplicationName("Dark Souls 2 Channel");
        mStreamPlayerConfig.setStreamName(videoName);
        mStreamPlayerConfig.setPortNumber(1935);

        mStreamPlayerView = (WOWZPlayerView) findViewById(R.id.vwStreamPlayer);

        mBtnPlayStream = (MultiStateButton) findViewById(R.id.ic_play_stream);
        mBtnSettings = (MultiStateButton) findViewById(R.id.ic_settings);
        mBtnMic = (MultiStateButton) findViewById(R.id.ic_mic);
        mBtnScale = (MultiStateButton) findViewById(R.id.ic_scale);

        mTimerView = (TimerView) findViewById(R.id.txtTimer);
        mStatusView = (StatusView) findViewById(R.id.statusView);
        mStreamMetadata = (ImageButton) findViewById(R.id.imgBtnStreamInfo);
        mHelp = (TextView) findViewById(R.id.streamPlayerHelp);

        mSeekVolume = (SeekBar) findViewById(R.id.sb_volume);

        WOWZStatusCallback statusCallback = new StatusCallback();
        mStreamPlayerView.play(mStreamPlayerConfig, statusCallback);


        mTimerView.setVisibility(View.GONE);

        mStreamPlayerView.play(mStreamPlayerConfig, statusCallback);




        if (sGoCoderSDK != null) {

            /*
            Packet change listener setup
             */
            final PlayerActivity activity = this;
            packetChangeListener = new WOWZPlayerView.PacketThresholdChangeListener() {
                @Override
                public void packetsBelowMinimumThreshold(int packetCount) {
                    WOWZLog.debug("Packets have fallen below threshold "+packetCount+"... ");

                    activity.runOnUiThread(new Runnable() {
                        public void run() {
                            Toast.makeText(activity, "Packets have fallen below threshold ... ", Toast.LENGTH_SHORT).show();
                        }
                    });
                }

                @Override
                public void packetsAboveMinimumThreshold(int packetCount) {
                    WOWZLog.debug("Packets have risen above threshold "+packetCount+" ... ");

                    activity.runOnUiThread(new Runnable() {
                        public void run() {
                            Toast.makeText(activity, "Packets have risen above threshold ... ", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            };
            mStreamPlayerView.setShowAllNotificationsWhenBelowThreshold(false);
            mStreamPlayerView.setMinimumPacketThreshold(20);
            mStreamPlayerView.registerPacketThresholdListener(packetChangeListener);
            ///// End packet change notification listener

            mTimerView.setTimerProvider(new TimerView.TimerProvider() {
                @Override
                public long getTimecode() {
                    return mStreamPlayerView.getCurrentTime();
                }

                @Override
                public long getDuration() {
                    return mStreamPlayerView.getDuration();
                }
            });

            mSeekVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    if (mStreamPlayerView != null && mStreamPlayerView.isPlaying()) {
                        mStreamPlayerView.setVolume(progress);
                    }
                }

                public void onStartTrackingTouch(SeekBar seekBar) {
                }

                public void onStopTrackingTouch(SeekBar seekBar) {
                }
            });

            // listen for volume changes from device buttons, etc.
            mVolumeSettingChangeObserver = new VolumeChangeObserver(this, new Handler());
            getApplicationContext().getContentResolver().registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, mVolumeSettingChangeObserver);
            mVolumeSettingChangeObserver.setVolumeChangeListener(new VolumeChangeObserver.VolumeChangeListener() {
                @Override
                public void onVolumeChanged(int previousLevel, int currentLevel) {
                    if (mSeekVolume != null)
                        mSeekVolume.setProgress(currentLevel);

                    if (mStreamPlayerView != null && mStreamPlayerView.isPlaying()) {
                        mStreamPlayerView.setVolume(currentLevel);
                    }
                }
            });

            mBtnScale.setState(mStreamPlayerView.getScaleMode() == WOWZMediaConfig.FILL_VIEW);

            // The streaming player configuration properties
            mStreamPlayerConfig = new WOWZPlayerConfig();

            mBufferingDialog = new ProgressDialog(this);
            mBufferingDialog.setTitle(R.string.status_buffering);
            mBufferingDialog.setMessage(getResources().getString(R.string.msg_please_wait));
            mBufferingDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getResources().getString(R.string.button_cancel), new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    cancelBuffering(dialogInterface);
                }
            });

            // testing player data event handler.
            mStreamPlayerView.registerDataEventListener("onMetaData", new WOWZDataEvent.EventListener(){
                @Override
                public WOWZDataMap onWZDataEvent(String eventName, WOWZDataMap eventParams) {
                    String meta = "";
                    if(eventParams!=null)
                        meta = eventParams.toString();


                    WOWZLog.debug("onWZDataEvent -> eventName "+eventName+" = "+meta);

                    return null;
                }
            });

            // testing player data event handler.
            mStreamPlayerView.registerDataEventListener("onStatus", new WOWZDataEvent.EventListener(){
                @Override
                public WOWZDataMap onWZDataEvent(String eventName, WOWZDataMap eventParams) {
                    if(eventParams!=null)
                        WOWZLog.debug("onWZDataEvent -> eventName "+eventName+" = "+eventParams.toString());

                    return null;
                }
            });

            // testing player data event handler.
            mStreamPlayerView.registerDataEventListener("onTextData", new WOWZDataEvent.EventListener(){
                @Override
                public WOWZDataMap onWZDataEvent(String eventName, WOWZDataMap eventParams) {
                    if(eventParams!=null)
                        WOWZLog.debug("onWZDataEvent -> "+eventName+" = "+eventParams.get("text"));

                    return null;
                }
            });
        } else {
            mHelp.setVisibility(View.GONE);
            mStatusView.setErrorMessage(WowzaGoCoder.getLastError().getErrorDescription());
        }

    }

    @Override
    protected void onDestroy() {
        if (mVolumeSettingChangeObserver != null)
            getApplicationContext().getContentResolver().unregisterContentObserver(mVolumeSettingChangeObserver);

        super.onDestroy();
    }

    /**
     * Android Activity class methods
     */

    @Override
    protected void onResume() {
        super.onResume();

        syncUIControlState();
    }

    @Override
    protected void onPause() {
        if (mStreamPlayerView != null && mStreamPlayerView.isPlaying()) {
            mStreamPlayerView.stop();

            // Wait for the streaming player to disconnect and shutdown...
            mStreamPlayerView.getCurrentStatus().waitForState(WOWZState.IDLE);
        }

        super.onPause();
    }
    private boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager
                = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }

    public boolean isPlayerConfigReady()
    {

        return false;
    }

    /*
    Click handler for network pausing
     */
    public void onPauseNetwork(View v)
    {
        Button btn = (Button)findViewById(R.id.pause_network);
        if(btn.getText().toString().trim().equalsIgnoreCase("pause network")) {
            WOWZLog.info("Pausing network...");
            btn.setText("Unpause Network");
            mStreamPlayerView.pauseNetworkStack();
        }
        else{
            WOWZLog.info("Unpausing network... btn.getText(): "+btn.getText());
            btn.setText("Pause Network");
            mStreamPlayerView.unpauseNetworkStack();
        }
    }

    /**
     * Click handler for the playback button
     */
    public void onTogglePlayStream(View v) {
        if (mStreamPlayerView.isPlaying()) {
            mStreamPlayerView.stop();
        } else if (mStreamPlayerView.isReadyToPlay()) {
            if(!this.isNetworkAvailable()){
                displayErrorDialog("No internet connection, please try again later.");
                return;
            }

//            if(!this.isPlayerConfigReady()){
//                displayErrorDialog("Please be sure to include a host, stream, and application to playback a stream.");
//                return;
//            }

            mHelp.setVisibility(View.GONE);
            WOWZStreamingError configValidationError = mStreamPlayerConfig.validateForPlayback();
            if (configValidationError != null) {
                mStatusView.setErrorMessage(configValidationError.getErrorDescription());
            } else {
                // Set the detail level for network logging output
                mStreamPlayerView.setLogLevel(mWZNetworkLogLevel);

                // Set the player's pre-buffer duration as stored in the app prefs
                float preBufferDuration = GoCoderSDKPrefs.getPreBufferDuration(PreferenceManager.getDefaultSharedPreferences(this));

                mStreamPlayerConfig.setPreRollBufferDuration(preBufferDuration);

                // Start playback of the live stream
                mStreamPlayerView.play(mStreamPlayerConfig, this);
            }

        }
    }

    /**
     * WOWZStatusCallback interface methods
     */
    @Override
    public synchronized void onWZStatus(WOWZStatus status) {
        final WOWZStatus playerStatus = new WOWZStatus(status);

        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                WOWZStatus status = new WOWZStatus(playerStatus.getState());
                switch(playerStatus.getState()) {

                    case WOWZPlayerView.STATE_PLAYING:
                        // Keep the screen on while we are playing back the stream
                        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

                        if (mStreamPlayerConfig.getPreRollBufferDuration() == 0f) {
                            mTimerView.startTimer();
                        }

                        // Since we have successfully opened up the server connection, store the connection info for auto complete

                        GoCoderSDKPrefs.storeHostConfig(PreferenceManager.getDefaultSharedPreferences(PlayerActivity.this), mStreamPlayerConfig);

                        // Log the stream metadata
                        WOWZLog.debug(TAG, "Stream metadata:\n" + mStreamPlayerView.getMetadata());
                        break;

                    case WOWZPlayerView.STATE_READY_TO_PLAY:
                        // Clear the "keep screen on" flag
                        WOWZLog.debug(TAG, "STATE_READY_TO_PLAY player activity status!");
                        if(playerStatus.getLastError()!=null)
                            displayErrorDialog(playerStatus.getLastError());

                        playerStatus.clearLastError();
                        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

                        mTimerView.stopTimer();

                        break;

                    case WOWZPlayerView.STATE_PREBUFFERING_STARTED:
                        WOWZLog.debug(TAG, "Dialog for buffering should show...");
                        showBuffering();
                        break;

                    case WOWZPlayerView.STATE_PREBUFFERING_ENDED:
                        WOWZLog.debug(TAG, "Dialog for buffering should stop...");
                        hideBuffering();
                        // Make sure player wasn't signaled to shutdown
                        if (mStreamPlayerView.isPlaying()) {
                            mTimerView.startTimer();
                        }
                        break;

                    default:
                        break;
                }
                syncUIControlState();
            }
        });
    }

    @Override
    public synchronized void onWZError(final WOWZStatus playerStatus) {
        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                displayErrorDialog(playerStatus.getLastError());
                syncUIControlState();
            }
        });
    }


    public void onToggleMute(View v) {
        mBtnMic.toggleState();

        if (mStreamPlayerView != null)
            mStreamPlayerView.mute(!mBtnMic.isOn());

        mSeekVolume.setEnabled(mBtnMic.isOn());
    }

    public void onToggleScaleMode(View v) {
        int newScaleMode = mStreamPlayerView.getScaleMode() == WOWZMediaConfig.RESIZE_TO_ASPECT ? WOWZMediaConfig.FILL_VIEW : WOWZMediaConfig.RESIZE_TO_ASPECT;
        mBtnScale.setState(newScaleMode == WOWZMediaConfig.FILL_VIEW);
        mStreamPlayerView.setScaleMode(newScaleMode);
    }


    public void onStreamMetadata(View v) {
        WOWZDataMap streamMetadata = mStreamPlayerView.getMetadata();
        WOWZDataMap streamStats = mStreamPlayerView.getStreamStats();
//        WOWZDataMap streamConfig = mStreamPlayerView.getStreamConfig().toDataMap();
        WOWZDataMap streamConfig = new WOWZDataMap();
        WOWZDataMap streamInfo = new WOWZDataMap();

        streamInfo.put("- Stream Statistics -", streamStats);
        streamInfo.put("- Stream Metadata -", streamMetadata);
        //streamInfo.put("- Stream Configuration -", streamConfig);

        DataTableFragment dataTableFragment = DataTableFragment.newInstance("Stream Information", streamInfo, false, false);


        getFragmentManager().beginTransaction()
                .add(android.R.id.content, dataTableFragment)
                .addToBackStack("metadata_fragment")
                .commit();
    }


    public void onSettings(View v) {
        // Display the prefs fragment
        GoCoderSDKPrefs.PrefsFragment prefsFragment = new GoCoderSDKPrefs.PrefsFragment();
        prefsFragment.setFixedSource(true);
        prefsFragment.setForPlayback(true);

        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, prefsFragment)
                .addToBackStack(null)
                .commit();
    }


    private void syncUIControlState() {
        boolean disableControls = (!(mStreamPlayerView.isReadyToPlay() || mStreamPlayerView.isPlaying()) || sGoCoderSDK == null);
        if (disableControls) {
            mBtnPlayStream.setEnabled(false);
            mBtnSettings.setEnabled(false);
            mSeekVolume.setEnabled(false);
            mBtnScale.setEnabled(false);
            mBtnMic.setEnabled(false);
            mStreamMetadata.setEnabled(false);
       } else {
            mBtnPlayStream.setState(mStreamPlayerView.isPlaying());
            mBtnPlayStream.setEnabled(true);

            if (mStreamPlayerConfig.isAudioEnabled()) {
                mBtnMic.setVisibility(View.VISIBLE);
                mBtnMic.setEnabled(true);

                mSeekVolume.setVisibility(View.VISIBLE);
                mSeekVolume.setEnabled(mBtnMic.isOn());
                mSeekVolume.setProgress(mStreamPlayerView.getVolume());
            } else {
                mSeekVolume.setVisibility(View.GONE);
                mBtnMic.setVisibility(View.GONE);
            }

            mBtnScale.setVisibility(View.VISIBLE);
            mBtnScale.setVisibility(mStreamPlayerView.isPlaying() && mStreamPlayerConfig.isVideoEnabled() ? View.VISIBLE : View.GONE);
            mBtnScale.setEnabled(mStreamPlayerView.isPlaying() && mStreamPlayerConfig.isVideoEnabled());

            mBtnSettings.setEnabled(!mStreamPlayerView.isPlaying());
            mBtnSettings.setVisibility(mStreamPlayerView.isPlaying() ? View.GONE : View.VISIBLE);

            mStreamMetadata.setEnabled(mStreamPlayerView.isPlaying());
            mStreamMetadata.setVisibility(mStreamPlayerView.isPlaying() ? View.VISIBLE : View.GONE);
        }
    }

    private void showBuffering() {
        try {
            if (mBufferingDialog == null) return;
            mBufferingDialog.show();
        }
        catch(Exception ex){}
    }

    private void cancelBuffering(DialogInterface dialogInterface) {
        if(mStreamPlayerConfig.getHLSBackupURL()!=null || mStreamPlayerConfig.isHLSEnabled()){
            mStreamPlayerView.stop(true);
        }
        else if (mStreamPlayerView != null && mStreamPlayerView.isPlaying()) {
            mStreamPlayerView.stop(true);
        }
    }

    private void hideBuffering() {
        if (mBufferingDialog.isShowing())
            mBufferingDialog.dismiss();
    }

   @Override
    public void syncPreferences() {
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        mWZNetworkLogLevel = Integer.valueOf(prefs.getString("wz_debug_net_log_level", String.valueOf(WOWZLog.LOG_LEVEL_DEBUG)));

        mStreamPlayerConfig.setIsPlayback(true);
        if (mStreamPlayerConfig != null)
            GoCoderSDKPrefs.updateConfigFromPrefsForPlayer(prefs, mStreamPlayerConfig);
    }

    private class StatusCallback implements WOWZStatusCallback {
        @Override
        public void onWZStatus(WOWZStatus wzStatus) {
        }
        @Override
        public void onWZError(WOWZStatus wzStatus) {
        }
    }
}

我得到的错误是;

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.wowza.gocoder.sdk.sampleapp/com.wowza.gocoder.sdk.sampleapp.PlayerActivity}: java.lang.RuntimeException: Invalid surface: null
java android-fragments wowza
1个回答
0
投票

您在onCreate中启动流。目前,WOWZPlayerView使用的Surface尚未就绪,应用程序因“无效曲面”错误而崩溃。如果您查看GoCoder SDK中的示例测试,则在用户单击按钮时开始播放。例如。当Surface有效时。创建一个按钮并移动'mStreamPlayerView.play(mStreamPlayerConfig,statusCallback);'按钮.onClick。或者......使用任何GoCoder SDK v1.7及更新版本。如果我可以进一步帮助,请告诉我。谢谢

© www.soinside.com 2019 - 2024. All rights reserved.