历史(无聊)

历史(无聊)

我刚刚尝试在 Ubuntu 12.04 工作站上使用索尼 DSLR 以 60 FPS 的速度播放 1080p AVCHD 视频文件,令我惊讶的是,MPlayer 无法流畅播放视频。我将文件复制到本地硬盘上。

视频播放速度比应有的速度慢,AV 不同步持续稳步增长(每播放 10 秒,大约会出现 1 秒的不同步)。8 个 CPU 线程中的一个线程突然达到 100%。

我想知道这是否是硬件上的问题。这有点难以置信,因为我的 T60 笔记本电脑可以正常播放视频,所以我怀疑是软件问题。

工作站规格:

  • CPU:英特尔四核 i7-920 @2.67GHz
  • 显卡:Nvidia GeForce 9600 GSO 512
  • 内存:8GB
  • Compiz 运行顺畅,尽管我在本次测试中将其关闭(视频播放没有任何改善)
  • 该系统通常速度极快,反应灵敏。
  • 以 30 FPS 的速度播放带有 h264 1080p 流的 MP4 效果很好。
  
root@boss:~# glxinfo | grep direct
直接渲染:是

root@boss:~# glxinfo | grep vendor
服务器 glx 供应商字符串:NVIDIA Corporation
客户端 glx 供应商字符串:NVIDIA Corporation
OpenGL 供应商字符串:NVIDIA Corporation


Mplayer 输出:

valprj@boss:~$ mplayer 00006.MTS
MPlayer svn r34540 (Ubuntu),使用 gcc-4.6 (C) 2000-2012 MPlayer 团队构建
mplayer:无法连接到套接字
mplayer:没有此文件或目录
无法打开 LIRC 支持。您将无法使用遥控器。

正在播放 00006.MTS。
libavformat 版本 53.21.1(外部)
标头版本 53.19.0 不匹配
检测到 TS 文件格式。
视频 H264(pid=4113) 音频 A52(pid=4352) SUB 图文电视(pid=4608) 节目 N. 1
FPS 似乎是:59.940060
在 ./ 中加载字幕
==========================================================================
打开视频解码器:[ffmpeg]FFmpeg的libavcodec编解码器系列
libavcodec 版本 53.35.0(外部)
标头版本 53.32.2 不匹配
选定的视频编解码器:[ffh264] vfm:ffmpeg (FFmpeg H.264)
==========================================================================
==========================================================================
打开音频解码器:[ffmpeg] FFmpeg/libavcodec 音频解码器
音频:48000 Hz,2 ch,s16le,256.0 kbit/16.67%(比例:32000->192000)
选定的音频编解码器:[ffac3] afm:ffmpeg (FFmpeg AC-3)
==========================================================================
AO:[alsa] 48000Hz 2ch s16le(每个样本 2 个字节)
开始播放...
不支持的 PixelFormat 61
不支持的 PixelFormat 53
不支持的 PixelFormat 81
电影宽高比为 1.78:1 – 预先缩放以校正电影宽高比。
画外音:[vdpau] 1920x1080 => 1920x1080 平面 YV12
A: 6.6 V: 6.1 AV: 0.496 ct: -0.017 453/453 96% 10% 0.6% 221 0


           ************************************************
           **** 你的系统太慢了,玩不了!****
           ************************************************

可能的原因、问题、解决方法:
- 最常见:音频驱动程序损坏或存在问题
  - 尝试 -ao sdl 或使用 ALSA 的 OSS 仿真。
  - 尝试使用不同的 -autosync 值,30 是一个不错的开始。
- 视频输出缓慢
  - 尝试不同的 -vo 驱动程序(-vo 帮助列表)或尝试 -framedrop!
- CPU 速度慢
  - 不要尝试在较慢的 CPU 上播放大型 DVD/DivX!尝试一些 lavdopts,
    例如-vfm ffmpeg -lavdopts lowres=1:fast:skiploopfilter=all。
- 文件损坏
  - 尝试 -nobps -ni -forceidx -mc 0 的各种组合。
- 慢速媒体(NFS/SMB 挂载、DVD、VCD 等)
  - 尝试 -cache 8192。
- 您是否使用 -cache 播放非交错 AVI 文件?
  - 尝试 -nocache。
阅读 DOCS/HTML/en/video.html 了解调整/加速技巧。
如果这些都对您没有帮助,请阅读 DOCS/HTML/en/bugreports.html。

A: 7.8 V: 7.2 AV: 0.602 ct: -0.017 520/520 97% 10% 0.6% 286 0
[h264 @ 0x7fe0a0468380]隐藏 136 DC、136 AC、136 MV 错误
A: 17.1 V: 15.6 AV: 1.495 ct: -0.017 1022/1022 97% 9% 0.6% 779 0

退出...(退出)


我尝试过的事情

  • 玩了-vc ffh264vdpau一下,有点帮助。不同步率变成了每播放 34 秒出现 1 秒不同步,视频速度为几乎对。CPU 使用率显著下降(最高 CPU 线程为 20%)。但我仍然得到:

    您的系统太慢,无法播放此游戏!

    来自 MPlayer 的消息。

  • 玩了之后-lavdopts skiploopfilter=all视频播放正常。CPU 徘徊在 93% 左右,AV 同步徘徊在 0.263 秒左右


问题

所以我的问题是 - 您认为 mplayer 在我的硬件上播放该视频时遇到这么多麻烦是合理的吗?或者您认为这里有一个软件问题?也许是 nvidia 驱动程序?

任何想法,将不胜感激!

答案1

我不确定您是否仍然需要帮助,但我会为未来的用户发布...我相信您遇到的问题是 mplayer 的默认配置仅使用一个处理器核心...尝试传递“-lavdoptsthreads=n”选项(其中'n'是使用的线程数)。

mplayer -lavdopts threads=4 00006.MTS

答案2

TLDR?确保您的 CPU 频率调节器不会被某些守护进程或事件触发脚本(例如电源管理脚本)改变。

历史(无聊)

我在两个不同的 Ubuntu 系统上都遇到过这个问题,尤其是在播放 h264/x264 视频时。视频播放速度变慢,而音频则继续正常播放。有时它会自行跟上,但有时需要 30 秒以上才能实现!

使用 CPU 使用率的实时图表,我注意到当问题发生时 CPU 使用率会变得更大(至少占当前频率的一部分,不幸的是我没有跟踪)。

一个临时的解决方法是与 MPlayer 进行交互,使其能够相当快地赶上,方法是使用下列方法之一:

  • [按下然后更改播放速度]
  • F按两次即可进入/退出全屏
  • 按“左”然后“右”键后退或前进

但奇怪的是,当我编写脚本自动发送这些键时,解决方法并没有像预期的那样赶上!看来需要与键盘进行实际的物理交互......

原因:省电调节器!

最后,我发现问题与 CPU 调节器有关。似乎脚本/etc/pm/power.d/cpu_frequency(在我的 Ubuntu 12.04 上)会间歇性地将频率调节器设置为powersave,即使我仍然插入交流电源。(这可能是由于软件错误或硬件(例如电源线有问题)造成的。)

不久之后(有时是几秒,有时是几分钟),脚本将调节器重新设置为ondemand,因此可能不容易检测到这种情况的发生!(我通过在脚本中添加一些日志来检测它echo "[$(date)] $0 was run with args $*" >> /tmp/cpu_frequency.log:)

临时解决方法(适合测试)

最初我通过在观看视频时在终端中运行这个小脚本来解决这个问题:

while true; do cpufreq-set -c 0 -g performance ; cpufreq-set -c 1 -g performance ; sleep 2; done  

此脚本要求您安装以下包cpufrequtilssudo apt-get install cpufrequtils

它只是确保 CPU 始终全速运行,每 2 秒执行一次。(偶尔我可能会看到 A/V 暂时失去同步,但随后它会赶上。)

如您所见,该脚本是为两个核心编写的。但我已经进行了调整这个脚本适用于任意数量的核心:

#!/bin/bash
while [[ 1 ]]
do
  for CPUFREQ in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
  do
    [ -f $CPUFREQ ] || continue
    echo -n performance > $CPUFREQ
  done
  sleep 2
done

这完全相同,并且不需要包cpufrequtils,但它不是一行。

永久解决方案

我们不需要使用上述脚本之一,而是可以通过禁用引起问题的脚本来使解决方案更加持久。

一种方法是删除麻烦的脚本:

sudo rm  /etc/pm/power.d/cpu_frequency

但一种破坏性较小的方法是编辑脚本。只需在文件顶部附近添加两行即可:

# <date_here> Disabled by <your_name> to assist mplayer A/V sync
exit 0

但请注意,此永久性解决方案意味着当您真正拔掉交流电源时,脚本不会切换到省电模式,因此您的电池可能不会像往常一样持续很长时间!

(尽管在我的系统 Asus X453M 上,直到电池电量降至非常低时,它才真正永久切换到省电模式。)

希望这对你有帮助。这个问题让我很沮丧!

相关内容