【问题标题】:Android MediaPlayer delayed surface draw causes video to be out of syncAndroid MediaPlayer 延迟表面绘制导致视频不同步
【发布时间】:2011-10-25 21:26:46
【问题描述】:

我正在使用 android 教程 here 中的方法将视频流式传输到我的 Motorola Droid 1。我从我想玩的两种不同格式中得到不同的行为。第一种(youtube lq 3gp)播放良好。第二种类型(youtube hq mp4)将在运行 TIOverlay 功能之前开始播放音频(所以没有视频),然后一旦视频被绘制出来,它就会与音频不同步。我知道我的手机支持 hq mp4 格式,因为它是移动 youtube 网站播放的类型,效果很好。有关格式的更多信息here

所以我想我要么需要一种方法来强制 TIOverlay 运行,要么需要一种方法来监听它以使其准备就绪并且直到那时才开始播放视频。下面的一些 logcat 输出显示了流程,在两种情况下都调用 onPrepared() 时很有趣。 3gp 似乎在 onPrepared() 之前和之后进行 TIOverlay 调用,而 mp4 只在之后进行。

编辑:同样的代码似乎在摩托罗拉 Droid 3 上运行。不过,如果该视频格式在我的 Droid 1 上的 youtube 上运行,我觉得它也应该在我的应用程序中运行。 我试图等待播放视频,直到它被缓冲一点。这不仅没有解决问题,而且在启动视频时缓冲区也会重新启动。

3GP:

10-25 16:56:26.750: DEBUG/TIOverlay(1103): overlay_createOverlay:IN w=176 h=144 format=22
10-25 16:56:26.946: INFO/Overlay(1103): v4l2_overlay_init:: w=480 h=854
10-25 16:56:26.946: INFO/Overlay(1103): v4l2_overlay_init:: w=176 h=144
10-25 16:56:26.946: INFO/Overlay(1103): v4l2_overlay_init:: w=176 h=144
10-25 16:56:26.961: INFO/Overlay(1103): 8 buffers allocated 4 requested
10-25 16:56:26.961: INFO/Overlay(1103): buffer cookie is 2
10-25 16:56:26.961: INFO/TIOverlay(1103): Opened video1/fd=138/obj=003a2160/shm=135/size=4096
10-25 16:56:26.961: DEBUG/TIOverlay(1103): overlay_createOverlay: OUT
10-25 16:56:26.961: INFO/TIOverlay(1103): Nothing to do!
10-25 16:56:26.969: INFO/Overlay(1014): query buffer, mem=1 type=2 index=0
10-25 16:56:26.969: INFO/Overlay(1014): query buffer, mem=1 type=2 index=1
10-25 16:56:26.969: INFO/Overlay(1014): query buffer, mem=1 type=2 index=2
10-25 16:56:26.969: INFO/Overlay(1014): query buffer, mem=1 type=2 index=3
10-25 16:56:26.969: INFO/Overlay(1014): query buffer, mem=1 type=2 index=4
10-25 16:56:26.969: INFO/Overlay(1014): query buffer, mem=1 type=2 index=5
10-25 16:56:26.969: INFO/Overlay(1014): query buffer, mem=1 type=2 index=6
10-25 16:56:26.969: INFO/Overlay(1014): query buffer, mem=1 type=2 index=7
10-25 16:56:26.969: INFO/Overlay(1014): query buffer, mem=1 type=2 index=0
10-25 16:56:26.969: INFO/TIOverlay(1014): Buffer/0/addr=4140a000/len=53248
10-25 16:56:26.969: INFO/Overlay(1014): query buffer, mem=1 type=2 index=1
10-25 16:56:26.969: INFO/TIOverlay(1014): Buffer/1/addr=41417000/len=53248
10-25 16:56:26.969: INFO/Overlay(1014): query buffer, mem=1 type=2 index=2
10-25 16:56:26.969: INFO/TIOverlay(1014): Buffer/2/addr=41424000/len=53248
10-25 16:56:26.969: INFO/Overlay(1014): query buffer, mem=1 type=2 index=3
10-25 16:56:26.969: INFO/TIOverlay(1014): Buffer/3/addr=41431000/len=53248
10-25 16:56:26.969: INFO/Overlay(1014): query buffer, mem=1 type=2 index=4
10-25 16:56:26.969: INFO/TIOverlay(1014): Buffer/4/addr=4143e000/len=53248
10-25 16:56:26.969: INFO/Overlay(1014): query buffer, mem=1 type=2 index=5
10-25 16:56:26.969: INFO/TIOverlay(1014): Buffer/5/addr=4144b000/len=53248
10-25 16:56:26.977: DEBUG/TI_Video_Decoder(1014): VIDDEC_SendCommand: Received request from omx client to change state to 2
10-25 16:56:26.985: DEBUG/TI_Video_Decoder(1014): Handle request for state transition: 1 => OMX_StateIdle
10-25 16:56:26.985: DEBUG/d(2220): videosizechanged()
10-25 16:56:27.102: DEBUG/TI_Video_Decoder(1014): OMX_StateIdle state reached
10-25 16:56:27.305: INFO/PlayerDriver(1014): buffering (15)
10-25 16:56:28.235: DEBUG/TI_Video_Decoder(1014): VIDDEC_SendCommand: Received request from omx client to change state to 3
10-25 16:56:28.243: WARN/MediaPlayer(2220): info/warning (1, 44)
10-25 16:56:28.258: INFO/MediaPlayer(2220): Info (1,44)
10-25 16:56:28.258: DEBUG/d(2220): onPrepared()
10-25 16:56:28.282: VERBOSE/BufferAllocOmap34xx(1014): BufferAllocOmap34xx::removeRef()
10-25 16:56:28.290: INFO/Overlay(1014): v4l2_overlay_init:: w=176 h=144
10-25 16:56:28.290: INFO/Overlay(1014): v4l2_overlay_init:: w=176 h=144
10-25 16:56:28.290: INFO/Overlay(1014): v4l2_overlay_init:: w=176 h=144
10-25 16:56:28.290: INFO/Overlay(1014): 8 buffers allocated 4 requested
10-25 16:56:28.290: INFO/Overlay(1014): buffer cookie is 2
10-25 16:56:28.290: INFO/Overlay(1014): query buffer, mem=1 type=2 index=0
10-25 16:56:28.290: INFO/Overlay(1014): query buffer, mem=1 type=2 index=1
10-25 16:56:28.290: INFO/Overlay(1014): query buffer, mem=1 type=2 index=2
10-25 16:56:28.290: INFO/Overlay(1014): query buffer, mem=1 type=2 index=3
10-25 16:56:28.290: INFO/Overlay(1014): query buffer, mem=1 type=2 index=4
10-25 16:56:28.290: INFO/Overlay(1014): query buffer, mem=1 type=2 index=5
10-25 16:56:28.290: INFO/Overlay(1014): query buffer, mem=1 type=2 index=6
10-25 16:56:28.290: INFO/Overlay(1014): query buffer, mem=1 type=2 index=7
10-25 16:56:28.297: INFO/TIOverlay(1014): Postponing Stream Enable/1/0
10-25 16:56:28.297: INFO/Overlay(1014): query buffer, mem=1 type=2 index=0
10-25 16:56:28.297: INFO/TIOverlay(1014): Buffer/0/addr=4140a000/len=53248
10-25 16:56:28.297: INFO/Overlay(1014): query buffer, mem=1 type=2 index=1
10-25 16:56:28.297: INFO/TIOverlay(1014): Buffer/1/addr=41417000/len=53248
10-25 16:56:28.297: INFO/Overlay(1014): query buffer, mem=1 type=2 index=2
10-25 16:56:28.297: INFO/TIOverlay(1014): Buffer/2/addr=41424000/len=53248
10-25 16:56:28.297: INFO/Overlay(1014): query buffer, mem=1 type=2 index=3
10-25 16:56:28.297: INFO/TIOverlay(1014): Buffer/3/addr=41431000/len=53248
10-25 16:56:28.297: INFO/Overlay(1014): query buffer, mem=1 type=2 index=4
10-25 16:56:28.297: INFO/TIOverlay(1014): Buffer/4/addr=4143e000/len=53248
10-25 16:56:28.297: INFO/Overlay(1014): query buffer, mem=1 type=2 index=5
10-25 16:56:28.297: INFO/TIOverlay(1014): Buffer/5/addr=4144b000/len=53248
10-25 16:56:28.891: DEBUG/dalvikvm(2050): GC_EXPLICIT freed 2271 objects / 138840 bytes in 229ms
10-25 16:56:28.966: INFO/PlayerDriver(1014): buffering (15)
10-25 16:56:29.930: WARN/MediaPlayer(2220): info/warning (1, 44)
10-25 16:56:30.258: INFO/TIOverlay(1103): Position/X0/Y0/W0/H0
10-25 16:56:30.258: INFO/TIOverlay(1103): Adjusted Position/X0/Y200/W480/H0
10-25 16:56:30.258: INFO/TIOverlay(1103): Rotation/0
10-25 16:56:30.266: INFO/Overlay(1103): v4l2_overlay_set_position:: w=480 h=854
10-25 16:56:30.266: INFO/Overlay(1103): v4l2_overlay_set_position:: w=480 h=392
10-25 16:56:30.266: INFO/Overlay(1103): dumping driver state:
10-25 16:56:30.266: INFO/Overlay(1103): output pixfmt:
10-25 16:56:30.266: INFO/Overlay(1103): w: 176
10-25 16:56:30.266: INFO/Overlay(1103): h: 144
10-25 16:56:30.266: INFO/Overlay(1103): color: 7
10-25 16:56:30.266: INFO/Overlay(1103): UYVY
10-25 16:56:30.266: INFO/Overlay(1103): v4l2_overlay window:
10-25 16:56:30.266: INFO/Overlay(1103): window l: 0 
10-25 16:56:30.266: INFO/Overlay(1103): window t: 200 
10-25 16:56:30.266: INFO/Overlay(1103): window w: 480 
10-25 16:56:30.266: INFO/Overlay(1103): window h: 392
10-25 16:56:30.266: INFO/Overlay(1103): output crop:
10-25 16:56:30.266: INFO/Overlay(1103): crop l: 0 
10-25 16:56:30.266: INFO/Overlay(1103): crop t: 0 
10-25 16:56:30.266: INFO/Overlay(1103): crop w: 176 
10-25 16:56:30.266: INFO/Overlay(1103): crop h: 144
10-25 16:56:30.274: DEBUG/d(2220): surfaceChanged()
10-25 16:56:30.297: DEBUG/d(2220): videosizechanged()

MP4:

10-25 16:51:57.454: DEBUG/d(2071): onPrepared()
10-25 16:51:58.360: DEBUG/d(2071): surfaceChanged()
10-25 16:52:02.219: DEBUG/TIOverlay(1103): overlay_createOverlay:IN w=640 h=360 format=22
10-25 16:52:02.219: INFO/Overlay(1103): v4l2_overlay_init:: w=480 h=854
10-25 16:52:02.219: INFO/Overlay(1103): v4l2_overlay_init:: w=640 h=360
10-25 16:52:02.219: INFO/Overlay(1103): v4l2_overlay_init:: w=640 h=360
10-25 16:52:02.243: INFO/Overlay(1103): 8 buffers allocated 4 requested
10-25 16:52:02.243: INFO/Overlay(1103): buffer cookie is 2
10-25 16:52:02.250: INFO/TIOverlay(1103): Opened video1/fd=139/obj=00501e18/shm=108/size=4096
10-25 16:52:02.250: DEBUG/TIOverlay(1103): overlay_createOverlay: OUT
10-25 16:52:02.250: INFO/TIOverlay(1103): Position/X0/Y0/W0/H0
10-25 16:52:02.250: INFO/TIOverlay(1103): Adjusted Position/X0/Y200/W480/H0
10-25 16:52:02.250: INFO/TIOverlay(1103): Rotation/0
10-25 16:52:02.250: INFO/Overlay(1103): v4l2_overlay_set_position:: w=480 h=854
10-25 16:52:02.250: INFO/Overlay(1103): v4l2_overlay_set_position:: w=480 h=270
10-25 16:52:02.250: INFO/Overlay(1103): dumping driver state:
10-25 16:52:02.250: INFO/Overlay(1103): output pixfmt:
10-25 16:52:02.250: INFO/Overlay(1103): w: 640
10-25 16:52:02.250: INFO/Overlay(1103): h: 360
10-25 16:52:02.250: INFO/Overlay(1103): color: 7
10-25 16:52:02.250: INFO/Overlay(1103): UYVY
10-25 16:52:02.250: INFO/Overlay(1103): v4l2_overlay window:
10-25 16:52:02.250: INFO/Overlay(1103): window l: 0 
10-25 16:52:02.250: INFO/Overlay(1103): window t: 200 
10-25 16:52:02.250: INFO/Overlay(1103): window w: 480 
10-25 16:52:02.250: INFO/Overlay(1103): window h: 270
10-25 16:52:02.250: INFO/Overlay(1103): output crop:
10-25 16:52:02.250: INFO/Overlay(1103): crop l: 0 
10-25 16:52:02.250: INFO/Overlay(1103): crop t: 0 
10-25 16:52:02.250: INFO/Overlay(1103): crop w: 640 
10-25 16:52:02.250: INFO/Overlay(1103): crop h: 360
10-25 16:52:02.250: INFO/TIOverlay(1103): Postponing Stream Enable/1/0
10-25 16:52:02.266: INFO/Overlay(1014): query buffer, mem=1 type=2 index=0
10-25 16:52:02.266: INFO/Overlay(1014): query buffer, mem=1 type=2 index=1
10-25 16:52:02.266: INFO/Overlay(1014): query buffer, mem=1 type=2 index=2
10-25 16:52:02.266: INFO/Overlay(1014): query buffer, mem=1 type=2 index=3
10-25 16:52:02.266: INFO/Overlay(1014): query buffer, mem=1 type=2 index=4
10-25 16:52:02.274: INFO/Overlay(1014): query buffer, mem=1 type=2 index=5
10-25 16:52:02.274: INFO/Overlay(1014): query buffer, mem=1 type=2 index=6
10-25 16:52:02.274: INFO/Overlay(1014): query buffer, mem=1 type=2 index=7
10-25 16:52:02.282: INFO/Overlay(1014): query buffer, mem=1 type=2 index=0
10-25 16:52:02.282: INFO/TIOverlay(1014): Buffer/0/addr=420f1000/len=462848
10-25 16:52:02.282: INFO/Overlay(1014): query buffer, mem=1 type=2 index=1
10-25 16:52:02.282: INFO/TIOverlay(1014): Buffer/1/addr=4269d000/len=462848
10-25 16:52:02.282: INFO/Overlay(1014): query buffer, mem=1 type=2 index=2
10-25 16:52:02.282: INFO/TIOverlay(1014): Buffer/2/addr=4270e000/len=462848
10-25 16:52:02.282: INFO/Overlay(1014): query buffer, mem=1 type=2 index=3
10-25 16:52:02.282: INFO/TIOverlay(1014): Buffer/3/addr=4277f000/len=462848
10-25 16:52:02.282: INFO/Overlay(1014): query buffer, mem=1 type=2 index=4
10-25 16:52:02.282: INFO/TIOverlay(1014): Buffer/4/addr=427f0000/len=462848
10-25 16:52:02.282: INFO/Overlay(1014): query buffer, mem=1 type=2 index=5
10-25 16:52:02.282: INFO/TIOverlay(1014): Buffer/5/addr=42861000/len=462848
10-25 16:52:02.282: INFO/Overlay(1014): query buffer, mem=1 type=2 index=6
10-25 16:52:02.282: INFO/TIOverlay(1014): Buffer/6/addr=428d2000/len=462848
10-25 16:52:02.282: INFO/Overlay(1014): query buffer, mem=1 type=2 index=7
10-25 16:52:02.289: INFO/TIOverlay(1014): Buffer/7/addr=42943000/len=462848

【问题讨论】:

    标签: android video streaming overlay media-player


    【解决方案1】:

    我似乎已经解决了这个问题。我的方法是查看它是否以最简单的形式工作(复制了 android 网站上的example code),果然成功了。然后我慢慢地将其构建为应用程序当前的功能,它仍然可以工作。不幸的是,我无法确定确切的原因,尽管在我的第一个实现中,我没有使用来自 android 站点的确切代码作为基础。似乎很多事情都会导致这个问题,包括在开始播放视频之前执行 seekTo ,仅举一个例子。任何其他遇到“音频但没有视频”错误的人,我建议采用这种方法,从最简单的实现开始并进行备份。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多