ARMデバイスでのPlexの熱意の飼いならし

それはすべて、Tosterでの私の質問から始まりました。 そして半年間、私はPlexメディアサーバーを使用しています。 それについて聞いたことがない人のために、私は説明します:これは、メディアライブラリを分析および構築し、登録およびSMSなしでそのような個人のNetflixだけでなく、ウェブ経由でメディアライブラリへのアクセスを提供するソフトウェアです。 Plexを使用して、ラップトップまたはChromebookのブラウザーから映画やテレビ番組を視聴します。







画像







以前は、NFSまたはSamba共有を構成し、 automount(8)を思い起こさせ、サスペンドレジューム後に共有ロールオフを設定するか、sftp / scpを使用してファイルをコピーする必要がありましたが、今は プレックス。 残念ながら、彼にとってすべてが簡単なわけではありません。







ホームサーバーの役割は、ARM Cortex-A7 1GHzプロセッサとArmbianディストリビューション(Dockerと名前空間をサポートするためのバニラカーネル(7) )を備えたCubietruckによって果たされます 。 日常的なニーズ(バックアップストレージ、VPNサーバー)には十分ですが、明らかにリソースを集中的に使用することを目的としたものではありません。







Plexはフリーウェアソフトウェアです。 それは無料ですが、特定の制限を課す無料ではありません。 たとえば、プロセッサアーキテクチャ用のソースコードや公式のdebパッケージはありません。 もちろん、多くの映画ファンは、自分のシステムに豚を突っ込むことを望まないでしょう。







Embyメディアサーバー

Monoで書かれた、Plexに類似したオープンソースのEmby Media Serverプロジェクトがあります 。 残念ながら、彼はブラウザでファイルを再生するのに問題があります。 Embyは、h264コーデックが最初に使用された場合でも、多くのビデオ形式を完全にトランスコードします。







現在、Plexでは、完全なトランスコーディングなしで、Emby Media Serverよりも多くのビデオ形式を再生できます。 おそらくあなたの一人がこの状況を修正するのを手伝うでしょう。 それまでの間、ブラウザのプロファイルを担当するbrowserdeviceprofile.jsファイルを思い浮かべることができます。







最初の問題は、NASデバイス用に公式に配布されたパッケージの助けを借りて解決し、2番目の問題は部分的にDockerの助けを借りて解決します。







ARMv7-X31 +アーキテクチャをベースとしたNAS QNAPのパッケージを取り上げましょう(このビルドは、CubietruckでサポートされているNeon拡張をサポートしています。cat cat /proc/cpuinfo | grep neon



コマンドで確認できます)。







 $ curl -s https://plex.tv/api/downloads/1.json | python -mjson.tool | grep x31plus "url": "https://downloads.plex.tv/plex-media-server/1.0.3.2461-35f0caa/PlexMediaServer_1.0.3.2461-35f0caa_arm-x31plus.qpkg
      
      





qpkgファイルは、シェルスクリプトといくつかのアーカイブの共生です。 次のコマンドを使用して、 plex_media_server



ディレクトリにplex_media_server



できplex_media_server









 $ mkdir plex_media_server $ wget https://downloads.plex.tv/plex-media-server/1.0.3.2461-35f0caa/PlexMediaServer_1.0.3.2461-35f0caa_arm-x31plus.qpkg $ dd if=PlexMediaServer_1.0.3.2461-35f0caa_arm-x31plus.qpkg bs=22954 skip=1 status=none | tar -xzf - -C plex_media_server
      
      





結果のファイルはDockerコンテナーに配置できますが、それについては後で詳しく説明します。 Plexを実行し、既にオーディオAC3 5.1のh264でエンコードされているムービーをブラウザーで視聴するとします。 Plexは何をしますか? AC3 5.1トラックのAAC 5.1へのトランスコードが開始されます。 また、ラップトップで動画を視聴するために、6つのチャンネルで動画を聴く必要はありません。また、視聴中に定期的に一時停止すると、プロセッサが遅くなります。







幸いなことに、Plexには編集可能な構成プロファイルがあります。 たとえば、ブラウザResources/Profiles/Web.xml









Web.xml
 <?xml version="1.0" encoding="utf-8"?> <Client name="Web"> <!-- Author: Plex Inc. --> <TranscodeTargets> <VideoProfile protocol="hls" container="mpegts" codec="h264" audioCodec="aac,mp3" context="streaming" /> <VideoProfile protocol="dash" container="mp4" codec="h264" audioCodec="aac" context="streaming" /> <VideoProfile protocol="http" container="mkv" codec="h264" audioCodec="aac,mp3" context="streaming" /> <MusicProfile container="mp3" codec="mp3" /> <PhotoProfile container="jpeg" /> <SubtitleProfile container="ass" codec="ass" context="all" /> </TranscodeTargets> <CodecProfiles> <VideoCodec name="*"> <Limitations> <UpperBound name="video.bitDepth" value="8" /> </Limitations> </VideoCodec> <VideoAudioCodec name="*"> <Limitations> <UpperBound name="audio.channels" value="6" /> </Limitations> </VideoAudioCodec> </CodecProfiles> </Client>
      
      





その中に、パラメーター<UpperBound name="audio.channels" value="6" />



があります。これは、オーディオのチャネルの最大数が6を超えてはならないことを示しています。 また、オーディオトラックをトランスコードする場合、6チャンネルのAC3をAACに変換すると、結果のAACも6チャンネルになります。 CPUリソースを再び使用して、6つのAC3チャネルをデコードし、6つのAACチャネルにエンコードします。 ビデオを見るとき、これは定期的なハングを引き起こします。







いわゆるダウンミックスを有効にするには、パラメーター6を2に置き換えて<UpperBound name="audio.channels" value="2" />



を取得する必要があります。 次に、6チャンネルのオーディオトラックを持つファイルがステレオに変換されます。







ほとんどのユーザーにとって、このオプションは受け入れられます。 ただし、6チャンネルのAACトラックを持つファイルを持っている人は対象外です。 この場合、6チャンネルAACはステレオAACに変換されます。 これもまた、プロセッサリソースの浪費であり、ビデオを見ているときに定期的にフリーズします。 私はプロファイルを手に入れることで問題を解決できるかもしれないと考えましたが、残念ながら現在のバージョンのPlexでは、そのような例外は不可能です。 Plexフォーラムは、同様のオプションを追加するよう求められて2週間未回答です。







この問題を解決するための唯一のオプションは、 Plex Transcoder



バイナリを、ビデオファイルにAACトラックがある場合に必要なパラメーターを生成するスクリプトに置き換えることで見ました。







magic.sh
 #!/bin/bash # This script disables transcode for videos which already have aac audio magic=0 i=0 input=false for arg in "$@"; do ((i++)) next=$((i+1)) if [[ "$arg" == "-i" ]]; then input=true fi if [[ "$arg" =~ -codec:[0-9] && "${@:$next:1}" == "aac" && $magic == 0 && $input == false ]]; then ((magic++)) continue fi if [[ "$arg" == "aac" && $magic == 1 ]]; then ((magic++)) continue fi if [[ "$arg" == "-codec:1" && $magic == 2 ]]; then ((magic++)) fi if [[ "$arg" == "aac" && $magic == 3 ]]; then args[$i]="copy" ((magic++)) continue fi if [[ "$arg" == "-ar:1" && $magic == 4 ]]; then args[$i]="-copypriorss:1" ((magic++)) continue fi if [[ "$arg" == "48000" && $magic == 5 ]]; then args[$i]="0" ((magic++)) continue fi if [[ "$arg" == "-channel_layout:1" && $magic == 6 ]]; then ((magic++)) continue fi if [[ "$arg" == "stereo" && $magic == 7 ]]; then ((magic++)) continue fi if [[ "$arg" == "-b:1" && $magic == 8 ]]; then ((magic++)) continue fi if [[ "$arg" == "256k" && $magic == 9 ]]; then ((magic++)) continue fi args[$i]=$(printf "%q" "$arg") done set -- "${args[@]}" eval "/opt/plex/Application/Resources/Plex\ Transcoder_ $@"
      
      





githubリンク: https : //github.com/kayrus/plex/blob/master/magic.sh







テスト中に、このハックが私のライブラリのビデオファイルでうまく機能することが判明しました。







Docker



それでは、これらすべてをDockerイメージでラップする方法を見てみましょう。 少なくとも、次の条件を満たしている必要があります。









以下は、私が使用しているDockefile



からの抜粋です。







ダウンロードしたアーカイブをコピーして解凍します(wgetから直接取得できますが、使用する構成では禁止されています)。 ADD



代わりにCOPY



を使用して、アーカイブの自動解凍を回避します。この場合、これは必要ありません。 式|| true



|| true



指定すると、アーカイブの終了後、gzipガベージメッセージを無視できます。







 COPY PlexMediaServer_1.0.3.2461-35f0caa_arm-x31plus.qpkg /tmp/plex_media_server.tar RUN { dd if=/tmp/plex_media_server.tar bs=22954 skip=1 status=none | tar -xzf - -C /opt/plex/Application || true; } && rm -f /tmp/plex_media_server.tar
      
      





非特権システムユーザーplex



をコンテナに追加します。







 RUN useradd -r -d /var/lib/plex -s /sbin/nologin plex
      
      





ダウンミックスをアクティブにします。







 RUN sed -i 's/name="audio.channels" value="6"/name="audio.channels" value="2"/' /opt/plex/Application/Resources/Profiles/Web.xml
      
      





コンテナ内の以降のすべてのアクションは、 plex



ユーザーによって実行されます。







 USER plex
      
      





パス/var/lib/plex



(メディアファイルベースの状態を保存するため)および/media



(メディアファイルのパス)を外部ボリュームとしてマークします。







 VOLUME ["/var/lib/plex","/media"]
      
      





コンテナ打ち上げ



以下のコマンドでは、標準ポート32400を80番目のhttpポートに変換し、パス/home/plex



をコンテナー内の/var/lib/plex



にマウントし、 /home/user/media



/media



にマウントします。







 $ docker run --name plex --hostname plex --rm -p 80:32400 -v /home/plex:/var/lib/plex -v /home/user/media:/media pleximage
      
      





systemd



プレックスコンテナの起動に使用するユニットファイル。







 [Unit] Description=Plex Media Server After=docker.service Requires=docker.service [Service] Environment=MEDIA_LIB=/home/user/media Environment=CONFIG_DIR=/var/lib/plex Environment=DOCKER_IMAGE=kayrus/plex Environment=PLEX_INT_PORT=32400 Environment=PLEX_EXT_PORT=32400 # Remove old Plex container ExecStarPre=-/usr/bin/docker rm plex ExecStart=/usr/bin/docker run --name plex --hostname plex --rm -p ${PLEX_EXT_PORT}:${PLEX_INT_PORT} -v ${CONFIG_DIR}:/var/lib/plex -v ${MEDIA_LIB}:/media ${DOCKER_IMAGE} # Fix foreign network which requires Plex login/signup ExecStartPost=/sbin/iptables -t nat -I POSTROUTING -o docker0 -p tcp -m tcp --dport ${PLEX_INT_PORT} -j MASQUERADE ExecStopPost=-/sbin/iptables -t nat -D POSTROUTING -o docker0 -p tcp -m tcp --dport ${PLEX_INT_PORT} -j MASQUERADE ExecStop=/usr/bin/docker stop plex # Remove pidfile after stop which prevents Plex server start ExecStopPost=/bin/rm -f ${CONFIG_DIR}/Library/Application\x20Support/Plex\x20Media\x20Server/plexmediaserver.pid [Install] WantedBy=multi-user.target
      
      





httpsおよびnginx



インターネットからPlexにアクセスするには、HTTPS接続を使用することをお勧めします。 追加のPlex機能に登録してお金を払いたくない場合は、証明書を自分で構成できます。 自己署名証明書を使用できます。Let's Encryptの証明書を使用できます。 しかし、最終的に、nginx設定ファイルは次のようになります。







nginx_plex.conf
 #     Plex dashboard,       . map $request_method$request_uri$http_referer $do_redirect { "GET/" 1; default 0; } server { # Listen only HTTPS socket listen [::]:443; # Enter your domain here server_name plex.example.com; # Configure your SSL certificates here ssl on; include ssl.conf; ssl_trusted_certificate ssl/ca-certs.pem; ssl_certificate ssl/plex.example.com.pem; ssl_certificate_key ssl/plex.example.com-key.pem; # Protect Plex by basic auth auth_basic "denied"; auth_basic_user_file .htpasswd; # Redirect to the Plex dashboard if ($do_redirect = 1) { return 302 https://$host/web; } # Default location location / { #     Plex   proxy_set_header Authorization ""; proxy_buffering off; proxy_pass http://localhost:32400; } # Websockets location location /:/websockets/ { #     Plex   proxy_set_header Authorization ""; proxy_buffering off; proxy_pass http://localhost:32400; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
      
      





参照:










All Articles