web-dev-qa-db-ja.com

MPlayer:システムが遅すぎてこれを再生できません!

Ubuntu 12.04ワークステーションのSony DSLRで60 FPSで記録された1080p AVCHDビデオファイルを再生しようとしましたが、驚いたことに、MPlayerはビデオをスムーズに再生できませんでした。ファイルをローカルハードドライブにコピーしました。

ビデオは本来よりも遅く再生され、A-V同期解除は着実に増加し続けます(再生10秒ごとに約1秒の同期解除)。 8つのCPUスレッドの1つが最大100%を撃ちます。

これが私のハードウェアで予想されるかどうか疑問に思っていました。 T60ラップトップがビデオを問題なく再生できることを考えると、信じがたいことですが、ソフトウェアの問題が疑われます。

ワークステーションの仕様:

  • CPU:Intel Quad Core i7-920 @ 2.67GHz
  • GPU:Nvidia GeForce 9600 GSO 512
  • RAM:8Gb
  • スムーズに機能する場合はCompizを使用しますが、このテストでは無効にしています(ビデオ再生の改善はありません)
  • このシステムは、通常、非常に高速で応答性に優れています。
  • 30 FPSでh264 1080pストリームを使用したMP4の再生は正常に機能します。
  
 root @ boss:〜#glxinfo | grep direct 
 direct rendering:はい
 
 root @ boss:〜#glxinfo | grep vendor 
 server glxベンダー文字列:NVIDIA Corporation 
 client glxベンダー文字列:NVIDIA Corporation 
 OpenGLベンダー文字列:NVIDIA Corporation 


Mplayer出力:

 valprj @ boss:〜$ mplayer 00006.MTS 
 MPlayer svn r34540(Ubuntu)、gcc-4.6(C)2000-2012 MPlayer Team 
 mplayerで構築:接続できませんでしたto socket 
 mplayer:そのようなファイルまたはディレクトリはありません
 LIRCサポートを開けませんでした。リモートコントロールを使用することはできません。
 
再生00006.MTS。
 libavformatバージョン53.21.1(外部)
不一致ヘッダーバージョン53.19.0 
 TSファイル形式が検出されました。
 VIDEO H264(pid = 4113)AUDIO A52(pid = 4352)SUB Teletext(pid = 4608)PROGRAM 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-映画のアスペクトを修正するためのプリスケーリング。
 VO:[vdpau] 1920x1080 => 1920x1080 Planar YV12 
 A:6.6 V:6.1 AV:0.496 ct:-0.017 453/453 96 %10%0.6%221 0 
 
 
 **************************** ******************** 
 ****お使いのシステムは遅すぎてこれを再生できません! **** 
 ******************************************** ******* 
 
考えられる理由、問題、回避策:
-最も一般的:壊れた/バグのある_audio_ driver 
--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。
-インターリーブされていないAVIファイルを再生するために-cacheを使用していますか?
-試してください-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 
 
 Exiting ...(Quit)


試したこと

  • -vc ffh264vdpauで遊ぶことは少し助けになりました。同期解除率は、再生34秒ごとに同期解除1秒になり、ビデオ速度はほぼ右です。 CPU使用率が大幅に低下しました(最高CPUスレッドで20%)。まだ私はまだ得ます:

    システムが遅いため、これを再生できません!

    mPlayerからのメッセージ。

  • -lavdopts skiploopfilter=allで再生すると、ビデオが適切に再生されました。 CPUは約93%で動き、A-V同期は約0.263秒で動きます


質問

だから私の質問はこれです-mplayerが私のハードウェアでそのビデオを再生するのにこれほどのトラブルがあるのは合理的だと言いますか、またはここにソフトウェアの問題があると思いますか?おそらくnvidiaドライバーですか?

どんなアイデアでも大歓迎です!

6
Val Blant

まだ支援が必要かどうかはわかりませんが、将来のユーザーのために投稿します...あなたが抱えている問題は、mplayerのデフォルト設定が1つのプロセッサコアしか使用しないことだと思います... 「-lavdopts threads = n」オプション(「n」は使用するスレッドの数)。

mplayer -lavdopts threads=4 00006.MTS
9
BuddyLuvve

TLDR? CPU周波数ガバナーがデーモンまたはイベントトリガースクリプト(電源管理スクリプトなど)によって変更されていないことを確認します。

歴史(つまらない)

特にh264/x264ビデオを再生する場合、2つの異なるUbuntuシステムでこの問題が発生しました。ビデオの再生速度は低下しますが、オーディオは通常どおり継続します。それ自体で追いつくこともあれば、それが起こるまでに30秒以上かかることもあります!

CPU使用率のリアルタイムチャートを使用して、問題が発生するとCPU使用率が大幅に増加することに気付きました(少なくとも現在の周波数の割合として、残念ながら追跡していません)。

一時的な解決策の1つは、次のいずれかの方法を使用して、MPlayerと対話し、かなり迅速に追いつくことです。

  • [を押してから]を押して、再生速度を変更します
  • Fを2回押して、フルスクリーンのオン/オフを切り替えます
  • 左ボタンを押してから右ボタンを押して、巻き戻しと順巻き

しかし、不思議なことに、これらのキーを自動的に送信するスクリプトを書いたとき、回避策は期待通りに追いつきませんでした!キーボードとの実際の物理的相互作用が必要だったようです...

原因:省電力ガバナー!

最後に、問題はCPUガバナーに関係していることがわかりました。 AC電源に接続したままでも、/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が一瞬同期を失うことがありますが、その後に追いつきます。)

ご覧のとおり、このスクリプトは2つのコア用に作成されています。しかし、私は このスクリプト を任意の数のコアで動作するように適合させました:

#!/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パッケージを必要としませんが、1行ではありません。

永続的なソリューション

上記のスクリプトのいずれかを使用するのではなく、代わりに、問題の原因となっているスクリプトを無効にすることにより、ソリューションをより永続的にすることができます。

そのための1つの方法は、面倒なスクリプトを削除することです。

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

しかし、それほど破壊的ではない方法は、スクリプトを編集することです。ファイルの上部近くに2行追加するだけです。

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

ただし、この永続的な解決策は、実際にAC電源からプラグを抜いてもスクリプトが省電力に切り替わらないことを意味するため、バッテリーは通常ほど長くは続かない可能性があります。

(私のシステムであるAsus X453Mでは、バッテリーの充電が非常に低くなるまで、実際には永久に省電力に切り替わりませんでした。)

これがあなたのお役に立てば幸いです。この問題は私にとって非常にイライラさせられました!

3
joeytwiddle