Java 使用Videoview或mediaplayer播放http实时流媒体视频是一种延迟

Java 使用Videoview或mediaplayer播放http实时流媒体视频是一种延迟,java,android,android-videoview,Java,Android,Android Videoview,首先,我使用videoview构建了一个小应用程序,在三星galaxt S2上播放mp4格式的hls视频。使用SD质量,视频流畅。但使用HD质量,视频滞后。然后,我构建了一个更大的应用程序,使用相同的videoview或mediaplayer android播放hls视频。当我播放视频时,视频质量落后于SD和HD 在小型应用程序中,我有一个字符串数组来存储URL。“我的应用”允许用户选择URL并按下按钮来抛出活动,以便使用videoview播放视频: 在小应用程序中使用videoview编码:

首先,我使用videoview构建了一个小应用程序,在三星galaxt S2上播放mp4格式的hls视频。使用SD质量,视频流畅。但使用HD质量,视频滞后。然后,我构建了一个更大的应用程序,使用相同的videoview或mediaplayer android播放hls视频。当我播放视频时,视频质量落后于SD和HD

在小型应用程序中,我有一个字符串数组来存储URL。“我的应用”允许用户选择URL并按下按钮来抛出活动,以便使用videoview播放视频: 在小应用程序中使用videoview编码:

        VideoView vd = (VideoView)findViewById(R.id.videoView1);
        MediaController mc = new MediaController(this);
        mc.setAnchorView(vd);
        Uri uri = Uri.parse(URL_link);
        vd.setMediaController(mc);
        vd.setVideoURI(uri);
        vd.start();
在更大的应用程序中,我使用listfragment显示所有URL。用户选择一个URL,然后抛出一个活动以使用videoview播放视频。活动中的代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_channel_detail);
    TextView tv = (TextView) findViewById(R.id.tvVideoPlayer);
    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        channel_id = extras.getInt(ChannelDetailActivity.CHANNEL_ID);
    }
    tv.setText("Video is playing...");
}
@Override
protected void onStart() {
    super.onStart();
    getChannelInfo();
}
private void getChannelInfo( ) {
    TimeTVApiCaller.getInstance().getChannel(channel_id, this,
            new AjaxCallback<ChannelInfo>() {
                @Override
                public void callback(String url, ChannelInfo object,
                        AjaxStatus status) {
                    if (object != null) {
                        Urlvideo = object.getChannelUrls().get(0).getPath();
                        getURLfull(Urlvideo);
                    }
                }
            });
}
    //get a full URL
protected void getURLfull(String url)
{
    TimeTVApiCaller.getInstance().getChannelStream(url, this, new AjaxCallback<String>()
            {
               @Override
            public void callback(String url, String object,
                    AjaxStatus status) {
            String Urlfull = object.replace("\"", "");
            Urltoken = Urlfull;
           //Using the same videoview
            VideoView vd = (VideoView) findViewById(R.id.videoView1);
            MediaController mc = new MediaController(ChannelDetailActivity.this);
            mc.setAnchorView(vd);
            Uri uri = Uri.parse(Urltoken);
            vd.setMediaController(mc);
            vd.setVideoURI(uri);
            vd.start();
            //vd.requestFocus();
            }
            });
}
   }
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u channel\u detail);
TextView tv=(TextView)findViewById(R.id.tVideoPlayer);
Bundle extras=getIntent().getExtras();
如果(附加值!=null){
channel\u id=extras.getInt(ChannelDetailActivity.channel\u id);
}
tv.setText(“正在播放视频…”);
}
@凌驾
受保护的void onStart(){
super.onStart();
getChannelInfo();
}
私有void getChannelInfo(){
TimeTVApiCaller.getInstance().getChannel(通道id,此,
新的AjaxCallback(){
@凌驾
公共无效回调(字符串url、ChannelInfo对象、,
AjaxStatus(状态){
if(对象!=null){
Urlvideo=object.getChannelUrls().get(0.getPath();
getURLfull(Urlvideo);
}
}
});
}
//获取完整的URL
受保护的void getURLfull(字符串url)
{
TimeTVApiCaller.getInstance().getChannelStream(url,this,new AjaxCallback())
{
@凌驾
公共无效回调(字符串url、字符串对象、,
AjaxStatus(状态){
字符串Urlfull=object.replace(“\”,”);
Urltoken=Urlfull;
//使用相同的视频视图
VideoView vd=(VideoView)findViewById(R.id.videoView1);
MediaController mc=新的MediaController(ChannelDetailActivity.this);
司仪setAnchorView(vd);
Uri=Uri.parse(Urltoken);
vd.设置媒体控制器(mc);
vd.setVideoURI(uri);
vd.start();
//vd.requestFocus();
}
});
}
}
我有两个问题:

  • 为什么videoview或mediaplayer播放hls视频是滞后的

  • 如何定制videoview或mediaplayer以顺利播放hls视频

  • HLS aka中的每个段通常为10秒

    播放器测量获取每个片段所需的时间,如果时间太长,它将尝试选择一个带宽,以便在播放之前获取一个或多个片段。最常见的错误是缓冲延迟。 您应该查看日志文件,查看播放器在播放内容时正在做什么


    如果以上内容没有帮助,可能会有所帮助。

    我假设高清质量至少为720p,并且超过1.5 mbps比特流,采用h.264/avc编码。我最好的猜测是S2硬件不支持它。

    对不起,我可以
    t。请尝试此url,看看它是否更好,如果您想遵循HLS标准,媒体的内容类型应该是ld的格式是m3u8。m3u8受Android 3.1及以上版本的支持。当然,我的格式url是。m3u8。你说得对!延迟是缓冲延迟。但手机的性能很高。视频不是延迟。所以。你知道原因吗?我发现HLS的性能在不同的Android设备和版本之间差异很大。试试library,它可以让你了解我们e HLS feed。我自己没有尝试过。我的问题是加载缓冲区太长,需要10秒以上。如何自定义缓冲区以最快的速度播放视频。我希望播放器加载最低比特率,并加载1-2秒段,但首先不加载10秒段。然后,播放器开始加载自适应双速率和10秒段。你能帮我吗?