从HttpResponse对象进行Android视频流传输

4

我希望能够从HttpResponse对象播放视频内容。该内容正在从流服务器下载。

我的要求是创建一个HTTP POST请求发送到服务器。请求包含视频URL,用户名和密码以进行身份验证。

我想知道如何创建HTTP POST请求并播放/下载视频。

请提供一些提示,步骤或代码来继续操作。

谢谢!

4个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
5
我不是100%确定,但我认为由于格式存储视频的元数据的方式,大多数视频都无法流式传输。这就是为什么YouTube必须转换您的视频文件而不仅仅以任何格式显示它们的原因。有一些协议可以封装此元数据并允许您流式传输任何视频(这就是YouTube移动端所做的)。您应该查看RTSP:http://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol 如果在videoView中使用rtsp链接,则应无缝流式传输视频。关键是您的问题与服务器有关,而不是客户端。 作为练习,您可以从m.youtube.com获取一个rtsp链接,并使用setVideoPath将其传递给videoView,它应该可以正常工作。 如果不能更改服务器实现,则您可能需要以下解决方案: 1)自己下载和解码视频,您必须处理所有元数据并确保视频确实有效。理论上,您可以编译适用于Android的ffmpeg来帮助您完成这项工作,但我无法编译具有网络选项的Android版本。这是很多工作。 2)编写自己的RTSP或其他流媒体协议实现。在线程中下载视频,然后在设备中创建本地服务器,将该视频文件流式传输到videoView实例。我实际上在一个应用程序中使用了这个功能。Android不支持客户端服务器使用的特定协议,我必须让它正常工作。我用了整整一个月来做到这一点。我无法发布任何示例代码,因为这都是客户的代码,但如果您有兴趣,我可以给您提供更多信息。 无论如何,如果您无法更改视频的服务器/格式,则应准备好大量的工作。

目前服务器使用Http流式传输,检索到的视频文件为.mp4格式。其他流媒体链接(如http://www.pocketjourney.com/downloads/pj/video/famous.3gp)在Android客户端应用程序中正常工作。您能否提供有关启用流媒体服务器所需的服务器配置的更多详细信息?谢谢,renam.antunes。 - Adarsh V C
这里:https://dev59.com/FknSa4cB1Zd3GeqPSfI4。Android 3.0应该可以使用HTTP Live Streaming,从2.2开始你就有了Flash 10.1,所以我猜你可以编写一个基于Flash的应用程序并使用RTMP / Flash HTTP Streaming。不过具体怎么做我也不太清楚。 - renam.antunes

4
请查看以下代码以在视频视图中显示http或rtsp网址。 现在,在调用您的VideoView之前,请获取
public class VideoViewDemo extends Activity {

    /**
     * TODO: Set the path variable to a streaming video URL or a local media
     * file path.
     */
    private String path = "";
    private VideoView mVideoView;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.videoview);
        mVideoView = (VideoView) findViewById(R.id.surface_view);

        if (path == "") {
            // Tell the user to provide a media file URL/path.
            Toast.makeText(
                    VideoViewDemo.this,
                    "Please edit VideoViewDemo Activity, and set path"
                            + " variable to your media file URL/path",
                    Toast.LENGTH_LONG).show();

        } else {

            /*
             * Alternatively,for streaming media you can use
             * mVideoView.setVideoURI(Uri.parse(URLstring));
             */
            mVideoView.setVideoPath(path);
            mVideoView.setMediaController(new MediaController(this));
            mVideoView.requestFocus();

        }
    }
}

现在,由于您的要求不同,首先向服务器发出HTTP POST请求...获取所需的输入流...将该流写入本地文件系统作为MP4。然后,您可以使用以下代码播放内容。

// this can be path on file system
 String path="/adf.mp4"  ; 
    public void playVideo() { 

        MediaController mediaController = new MediaController(this);
        mediaController.setMediaPlayer(videoView);
        videoView.setVideoPath(path);   
        videoView.setMediaController(mediaController);
        videoView.requestFocus();
        videoView.start();
        mediaController.show();

嗨,Anil,上面的代码是用于下载视频并将其保存在文件系统中以及播放它。但我的要求是直接从服务器上播放它(视频流)。 - Adarsh V C
嗨Adarsh...你可以直接使用VideoView的setVideoPath方法来流式传输RTSP视频。...在这种情况下,它将进行GET请求。但是就你的问题而言,你需要在POST请求中发送用户名和密码..所以如果你还没有尝试过,有一个解决方法..单独制作一个HTTP POST请求并获取认证令牌..将此认证令牌与下载视频的URL一起传递,并使用VideoView流式传输。 - success_anil

2
我尝试了这个方法,对我有效 :D 没有rtsp或其他复杂的东西,只需一个mp4视频的url就可以播放!
public class VideoActivity extends Activity {
    public static final String KEY = "video_id";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fotogaleria_video);
    Intent i = getIntent();
    if(i.hasExtra(KEY)){
        String url = "https://sites.google.com/site/tempmp4download/bnm.mp4";
        VideoView vv = (VideoView)findViewById(R.id.fotogaleria_video);
        // vv.setVideoPath(url);
        vv.setVideoURI(Uri.parse(url));
        vv.setMediaController(new MediaController(this));
        vv.requestFocus();
        vv.start();

        }

    }
}

1

谢谢Ashwani。我想知道如何从响应中获取实时流内容并在Mediaplayer或VideoView中播放的步骤/代码。 :( - Adarsh V C
对于流媒体,我认为您必须下载完整的文件,然后在视频播放器中显示它。如果是这样的话,我猜不需要下载视频来进行流媒体,那么直播是如何工作的呢? - Rahul Matte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,