Ubuntu 12.04ワークステーションのSony DSLRで60 FPSで記録された1080p AVCHDビデオファイルを再生しようとしましたが、驚いたことに、MPlayerはビデオをスムーズに再生できませんでした。ファイルをローカルハードドライブにコピーしました。
ビデオは本来よりも遅く再生され、A-V同期解除は着実に増加し続けます(再生10秒ごとに約1秒の同期解除)。 8つのCPUスレッドの1つが最大100%を撃ちます。
これが私のハードウェアで予想されるかどうか疑問に思っていました。 T60ラップトップがビデオを問題なく再生できることを考えると、信じがたいことですが、ソフトウェアの問題が疑われます。
root @ boss:〜#glxinfo | grep direct direct rendering:はい root @ boss:〜#glxinfo | grep vendor server glxベンダー文字列:NVIDIA Corporation client glxベンダー文字列:NVIDIA Corporation OpenGLベンダー文字列:NVIDIA Corporation
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ドライバーですか?
どんなアイデアでも大歓迎です!
まだ支援が必要かどうかはわかりませんが、将来のユーザーのために投稿します...あなたが抱えている問題は、mplayerのデフォルト設定が1つのプロセッサコアしか使用しないことだと思います... 「-lavdopts threads = n」オプション(「n」は使用するスレッドの数)。
mplayer -lavdopts threads=4 00006.MTS
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では、バッテリーの充電が非常に低くなるまで、実際には永久に省電力に切り替わりませんでした。)
これがあなたのお役に立てば幸いです。この問題は私にとって非常にイライラさせられました!