Android:在UI线程上快速更新的更新

4

我有一个播放视频帧的应用程序,这一切都正常工作。然而,它还需要同时播放音频,当音频和视频同时运行时,似乎视频落后于音频,
我用来显示视频帧的逻辑如下:

 ProcessVideoThread(){

  // Read the data from socket, 

  // decode it : this is going to be in side libvpx library, after decoding i am getting raw     
  // bitmap data 

  // After getting raw bitmap data, use some mechanism to update the image, 
  // here i tried runOnUIThread, handler but 


 }

现在发生的情况是,UI线程似乎得到了更新图像的机会很晚,即libvpx需要大约30毫秒来解码图像,并通过runOnUIThread花费40毫秒来更新图像,但我是在UI线程内部进行更新的。
有人能给我建议吗?如何减少在UI线程上更新图像的延迟。


似乎最昂贵的任务是从套接字中检索数据。我会在类似于Canvas的视图上进行自定义绘制。为每个循环发布新的Runnable对象到事件队列太慢了。 - Mister Smith
请查看这个问题:http://stackoverflow.com/q/7363770/813951 - Mister Smith
没错。调用 runOnUiThread 就会创建一个新的 Runnable 实例,最重要的是,如果调用线程不是 UI 线程,则将 Runnable 排队到事件队列中。因此,无法保证何时运行发布的可运行项。如果有其他待处理的 UI 事件(例如菜单触摸事件),则执行可能会延迟。摆脱这个问题并使用自定义绘图。 - Mister Smith
嘿,问题解决了吗?否则我会尝试帮助你。 - Sandeep
好的。我曾经在Android上做过类似的项目,可以从USB相机录制和播放视频。我也使用了Canvas来显示屏幕上的数据。您可以实现频率缩放以匹配音频的速度。但是,质量会受到影响。如果您想知道解决方案,请告诉我,我会发布相同的内容。 - Sandeep
显示剩余4条评论
1个回答

1

看起来很有趣。如果我处于你的情况下,我会考虑以下方法。

1)尝试在音频和视频线程之间使用同步。

2)尝试减少视频帧率,以解决音频滞后问题,并降低音频频率,以解决视频滞后问题。

你可以按照以下方式进行操作。

int i;
if(i%2==0)
ShowFrame();
else
i++

这将直接将视频速度从24 12降低,以使音频与视频匹配。但是,正如我之前提到的那样,质量会受到影响。这种方法称为频率缩放,是一种广泛使用的同步音频和视频的方法。

请参考以下内容,了解您可以同步音频和视频的方式以及清晰的理解。这与FFMPEG有关。我不知道您能够使用多少,但肯定会帮助您获得一些想法。

http://dranger.com/ffmpeg/tutorial05.html

祝一切顺利。


正如所述,音频是在20毫秒内到达,而视频是在40毫秒内到达,如何实现同步?我的尝试是确保两个线程获得相等的优先级,一旦获取数据,尽快尝试播放(无论是音频还是视频)。现在的情况是一个线程得到的机会较少,因此视频会被延迟。 - Amitg2k12

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