我刚刚尝试在 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
此脚本要求您安装以下包cpufrequtils
:sudo 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 上,直到电池电量降至非常低时,它才真正永久切换到省电模式。)
希望这对你有帮助。这个问题让我很沮丧!