【问题标题】:Android HLS Streaming - Different Android Versions Load Different Location in StreamAndroid HLS Streaming - 不同的 Android 版本在 Stream 中加载不同的位置
【发布时间】:2013-05-24 12:34:00
【问题描述】:

我意识到在 Android 中 HLS 的支持级别方面存在一些问题。我正在尝试编写一个小型视频播放器演示(在尽可能多的设备上工作);最好不使用第三方库;可以流式传输 HLS 视频。

注意:我目前正在 JellyBean 4.2.2 上进行测试,但可以访问其他版本

我已设法使用 MediaPlayer 类,以便我的应用能够开始播放流(例如 Apple 的测试视频 BipBopAll),但它似乎正在加载流的错误部分,因为视频似乎从 29 分钟开始(因此它在大约 30 秒后结束)。

我使用的代码非常基本:

private void playTrack()
{   
    player = new MediaPlayer();

    try 
    {                   
        player.setDisplay(holder);
        player.setDataSource("http://devimages.apple.com/iphone/samples/bipbop
                              /bipbopall.m3u8");
        player.prepare();

    } 
    catch (...) 
    {
    }
    player.start();
}

更新:我已经在 ICS 4.0.4 上测试了相同的代码,它可以正常工作。在 3.0.1 中测试,在 15 分钟加载流,然后从那里正确运行。

如何确保流从头开始,并在多个 Android 版本上正确播放?

或者,我应该使用更好的实现吗?

【问题讨论】:

    标签: android video-streaming http-live-streaming


    【解决方案1】:

    您是否尝试在 URL 中为 Player 提供启动参数?

    像这样:

    http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8?start=0

    【讨论】:

    • 同样的结果,视频从大约 29 分半钟开始。
    【解决方案2】:
       <?xml version="1.0" encoding="utf-8" ?> 
        - <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
          <VideoView android:id="@+id/surface_view" android:layout_width="fill_parent" android:layout_height="300dp" android:layout_gravity="center" /> 
          <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_below="@+id/surface_view" android:layout_marginRight="62dp" android:layout_marginTop="16dp" android:text="Stop" /> 
          <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/button1" android:layout_alignBottom="@+id/button1" android:layout_alignParentLeft="true" android:layout_marginLeft="34dp" android:text="Start" /> 
          </RelativeLayout>
    
    *******************************************************************
         startB.setOnClickListener(new View.OnClickListener() {
    @Override
                public void onClick(View v) {
                     mVideoView = (VideoView) findViewById(R.id.surface_view);
                       mVideoView.setVideoURI(Uri.parse("http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"));                
                       mVideoView.setMediaController(new     MediaController(MainActivity.this));
                       mVideoView.requestFocus();              
                       mVideoView.postInvalidateDelayed(100);  
                      new Thread(new Runnable() {
                          public void run() {
                              mVideoView.start();
    
                          }
                      }).start();
                }
            });
    

    【讨论】:

    • 感谢@Pankaj 的回复。不幸的是,我仍然看到同样的问题。您的代码在 ICS 4.0.4 上适用于我,但在 Jellybean 4.2 上,流加载时间为 29 分 30 秒
    【解决方案3】:

    经过进一步调查,我发现以下信息有望帮助其他人在 Android 上运行 HLS 流。

    编码 - 视频编码和分段设置会对视频支持的 Android 版本产生很大影响。我最终使用 HandBrake 创建了一个视频,设置如下:

    • MP4 文件
    • H.264;基线资料; 3 级
    • AAC 音频; 44.1k; 128 位(注意:我发现 JellyBean 对音频比 ICS/Honeycomb 更挑剔。某些音频比特率会创建 Jellybean 根本无法播放的视频。一般来说,单声道和低比特率音频似乎在 Jellybean 上工作得更好)。

    Segmentation - 使用 Apple MediaFileSegmenter,我发现添加“-no-floating-point-duration”和“-z none”标志可以让我创建一个适用于 Android 3.0 的视频 - >4.2

    姜饼 - 我无法让 Android 2.3 开箱即用地与 HLS 一起工作,但我确实发现使用 Vitamio 库效果很好(有关详细信息,请参阅 this question

    【讨论】:

    • 您是否发现有必要在使用 mediafilesegmenter 进行转换和分段之前使用手刹重新编码 MP4?我尝试了来自 youtube 的 360p MP4(带有 aac 的 h.264)并使用 mediafilesegmenter 进行处理;生成的 HLS 在 iPad 上运行良好,但在 Android 4.0.3 上 1 秒后挂起。
    • @Fixee 是的,我发现 MP4 的设置可能比用于分段的设置更重要。如上所述,我发现音频设置比视频更容易搞砸。作为测试,尝试在 mediafilesegmenter 中添加 -A 标志。这会给你一个没有音频的视频。如果流式传输正确,您就会知道这是您需要调整的音频设置。
    • 使用 -A 可以清除我遇到的视频显示的所有问题。谢谢.. 现在是时候搞砸音频设置了! :)
    • 从 Flash Media Server vod(使用不支持浮点值的 ext-x-version 2)转移到制作我们自己的 .ts 文件、托管和在其他地方提供它们,尽管使用 ext-x-版本 3 和浮点持续时间。安卓坏了。仅将 #EXTINF: 行更改为整数值似乎已修复它。
    【解决方案4】:

    某些版本的 Android 似乎将 http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8 处的 HLS 解释为直播 HLS 而不是 VOD HLS,因此媒体播放器在接近“直播”点、接近内容结束时开始播放,大约在 29 分钟后进入内容。

    原因如下:在 4.3 之前,不会解析 HLS 播放列表文件中的最后一行,除非它以 '\n' 结尾。

    查看该文件的更改历史记录:http://androidxref.com/4.3_r2.1/history/frameworks/av/media/libstagefright/httplive/M3UParser.cpp,2012 年 12 月 31 日,有修复问题的更改。这个问题在 4.4 上消失了。

    因此,解决旧版本问题的一种方法是在服务器上播放列表的最后一行之后添加换行符,或者在您的应用中实现一个 HTTP 代理来有效地添加该换行符,这可能并非易事。 .

    【讨论】:

    • 我不知道为什么这意味着 Honeycomb 在 15 分钟开始?
    • 不太了解 Android 3.0 w.r.t。 HLS。它当时是刚刚添加的,可能比现在更容易出错。
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多