Raspberry Pi (Linux)のCMカットでjoin_logo_scpを使う(wineなし)

Linuxでjoin_logo_scp(長いので次からJLSって略します。)といえばWindowsで使える高精度CMカットツールで有名ですね。Windows限定というところが惜しい。Linuxで使えるCMカットツールというと

  • CMCut4U
  • ComSkip

あたりが有名どころですが、どうも精度などの評判が悪い、というかjoin_logo_scpが頭一つ抜けてるんですよね。ロゴ消しできるのもありがたい。というか、Linuxで自動でロゴ消しもするとなるとこのツール一択かと思います。

最近そんな素晴らしいjoin_logo_scpがLinuxでネイティブに動くように移植されていたのでこれのインストールをしてみようと思います。wineとか使わないでいいのでARM系コンピュータでも大丈夫です。

ちなみに録画環境やそのセットアップの仕方も今度別の記事にしておきますが、今回join_logo_scpを動かす環境はかなり特殊なので、多くのところで躓くのでしっかり説明していこうと思います。

目次

大切なことなので必ず確認してください

CPUにはアーキテクチャというものがあり、ものによって使える「命令セット」というのが異なります。例えばIntelのCPUとAMDのCPUは使える命令が一部異なったりします。突然なんの話かと思われることかと思いますが、今回のセットアップ手順は少なくともWindowsが簡単にインストールできるパソコンではこの手順でできません。相当細かい話ですが、armhf(中身はarmv8l)とaarch64(armv8l)の環境で確認を取りました。いわゆるARM環境です。相当サポートがひどいデバイスでなんとかなったのでほとんどのARMデバイスにインストールできると思います。このアーキテクチャの関係でプログラムをビルドできなかったりするのでここの確認は非常に大切です。

※armhf(中身はarmv8l)と書いていますが、どういうことかというと、armv8lはIntelでいうとこの64bitプロセッサーのことを表していて、armhfは動作モードでWindowsでいうとこの32bitOSのことで、64bitCPUで32bitのOS動かしているような状態です。(ここでいう動作モードとはOSなどでいうところユーザーモード、カーネルモードとは別で説明のために用いているだけで正し言い回しではありあません)

追記(2020/11/22):私がインストールした際に出たエラーは極力記載していますが、コメントで寄せられたエラーなどの対処法を以下のページでまとめました。ソースファイルも置いてあるので最新版でうまくいかない場合などに使ってください。

環境

環境1(OSは2つで試したのでどちらも書いておきます。)。OSはデスクトップ+推奨ソフトフェアのインストールされたやつです。

  • Raspberry Pi4 model B+ 4GB
  • Raspbian 32bit (9月ぐらいのやつのリリース)
  • Raspberry Pi 32bit OS(旧Raspbian) 5.23.リリース分
  • armhf (on armv8l)
  • microSD 16GB SanDisk Industrial
  • microSD 32GB SanDisk High Endurance

環境2

  • OrangePi 3 2GB without emmc
  • Armbian Bionic 5.6.4 (Ubuntu Bionic 64bit)
  • aarch64 (on armv8l)
  • microSD 16GB SanDisk Industrial

環境1はド安定Raspberry Piなのでセットアップは容易…とまではいいませんが、環境2に比べたら容易です。環境2は色々なところで躓きました。ソフトウェアが充実していないといわれがちなOrange PiでビルドできればほとんどのARMなSBCでインストール可能かと思います。

インストール

はじめに 必要なパッケージをインストールします。2つに分かれていますが、依存関係の都合です。

いったんパッケージのインストール

sudo apt-get install build-essential cmake ninja-build libmp3lame-dev libopus-dev libvorbis-dev libvpx-dev libx265-dev libx264-dev libavcodec-dev libavformat-dev libswscale-dev libatomic-ops-dev automake libtool autoconf nodejs
sudo apt-get install meson npm

上に書いたものがRaspbianのフルのやつなので、Raspbian Liteなど最低限のOSだったり、Armbianのような別OSだとさらにパッケージが必要になったりするので、その都度入れてください。例えば、OPi3にインストールしたArmbian Bionic(Ubuntu Serverと同等ぐらいの機能)だと追加で以下のパッケージが必要でした。

sudo apt-get install libxft-dev

fdk-aac

fdk-aacはパッケージレポジトリにないのと、高ビットレートのAACを扱うのに必要らしいので、ソースからコンパイルします。以下のmake -j4 の4はインストールするコンピュータのコア数にするのがいいかと思います。Raspberry PiもOrange Piも 4コアです。

git clone https://github.com/mstorsjo/fdk-aac.git
cd fdk-aac
./autogen.sh
./configure
make -j4   //必要に応じてj4を変更
sudo make install 
sudo /sbin/ldconfig

l-smash

次に、l-smashのインストールです。

git clone https://github.com/l-smash/l-smash.git
cd l-smash
./configure --enable-shared
make
sudo make install
sudo ldconfig

AviSynthPlus

次にAviSynthPlusのインストールです。

git clone --depth 1 git://github.com/AviSynth/AviSynthPlus.git
cd AviSynthPlus
mkdir avisynth-build
cd avisynth-build
cmake -DCMAKE_CXX_FLAGS=-latomic ../ -G Ninja
ninja
sudo ninja install

エラーなくインストールできてれば大丈夫です。

ここで躓いたのですが、最新版のRaspberry Pi OS(Raspbian)だと、"cmake -DCMAKE_CXX_FLAGS=-latomic ../ -G Ninja" で"-DCMAKE_CXX_FLAGS=-latomic"を付け忘れると以下のようなエラーが発生します。公式ドキュメントの通りにするとインストールできません。

symbol lookup error:~libavisynth.so:undefined symbol:__atomic_store_8

なので"-DCMAKE_CXX_FLAGS=-latomic"オプションを忘れないようにしておいてください。ちなみに、Rapbianの2019-9あたりのリリース分の古いOSでは起こらなかったのでいつかOSに修正とか入るかもしれません。

次にffmpegのインストールをします。aptで降ってくるやつは今回使えない(AviSynthPlusが使えません)ので、ソースからビルドする必要があります。下に2パターン記述しておくので、環境に合わせて設定して下さい。どちらもビルドにRPi4で15分、RPi3で30分ぐらい時間はかかるので気長に待ちましょう。

Raspbian 32bit でのffmpegのビルド

以下にRaspbian 32bitでの環境下のコマンドを示します。

git clone --depth 1 https://github.com/FFmpeg/FFmpeg.git
cd FFmpeg
./configure --extra-ldflags="-latomic" --extra-cflags="-I/usr/local/include" --extra-ldflags="-L/usr/local/lib" --arch=armel --target-os=linux --enable-gpl --disable-doc --disable-debug --enable-pic --enable-avisynth --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-nonfree --enable-mmal --enable-omx-rpi --enable-omx --extra-libs=-ldl
 make -j4   //必要に応じて4は変えてください
sudo make install

"--enable-mmal --enable-omx-rpi --enable-omx"の部分は、Raspbery Piのハードウェアエンコーダのomx系エンコーダ、デコーダを有効化するオプションなので、Raspberry Pi以外のARM系コンピュータなら以下の手順になります。

64bit Armbianなど他OSでのビルド

"./configure"のオプションの"--arch=aarch64"部分は必要に応じて変更してください。armv8系で、64bitOSならほとんどこれで大丈夫だとは思います。

git clone --depth 1 https://github.com/FFmpeg/FFmpeg.git
./configure --extra-ldflags="-latomic" --extra-cflags="-I/usr/local/include" --extra-ldflags="-L/usr/local/lib" --arch=aarch64 --target-os=linux --enable-gpl --disable-doc --disable-debug --enable-pic --enable-avisynth --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-nonfree --extra-libs=-ldl
 make -j4   //必要に応じて4は変えてください
sudo make install

L-SMASH-Works

ffmpegのインストールを終えたら、次にL-SMASH-Worksのインストールなどですがここが一番難関でした。セットアップの環境に合わせて適切に読み替えてください。あとこのコマンドは2020.7.5にセットアップしていたもので、sedの行のコマンドはL-SMASH-Works側のアップデートで変更になる可能性が高いです。なのでコマンドを過信せず、やるべきことまとめるので、その通りに操作してください。あくまで参考までに下のコマンドを実行しました。これを説明していきます。

cd
git clone https://github.com/HolyWu/L-SMASH-Works.git
git clone https://github.com/tobitti0/chapter_exe.git -b arm-test
sudo cp chapter_exe/src/sse2neon.h L-SMASH-Works/AviSynth/emmintrin.h
cd L-SMASH-Works/AviSynth
sed -i.bk -e '42,43d' -e "72aif host_machine.cpu_family().startswith('arm')\n add_project_arguments('-mfpu=neon', language : ['c', 'cpp'])\nendif\n" meson.build
sed -i.bk '52d' video_output.cpp
CC=gcc CXX=gcc LD=gcc LDFLAGS="-Wl,-Bsymbolic,-L/opt/vc/lib" meson build
cd build
ninja -v
sudo ninja install
ldconfig

では少しずつ分けて説明しておきます。ホームディレクトリで作業を行います。

cd 
git clone https://github.com/HolyWu/L-SMASH-Works.git
git clone https://github.com/tobitti0/chapter_exe.git -b arm-test
sudo cp chapter_exe/src/sse2neon.h L-SMASH-Works/AviSynth/emmintrin.h

まずこのgitでAviSynthPlusのビルドで、ARM専用の別ファイルが必要になるのでそれをAviSiynthPlusのフォルダにコピーする必要があります。ここでやっているのは、後でも使うchapter_exe内のsse2neon.hをemittrin.hとしてAviSynthPlusとしてビルドしています。

cd L-SMASH-Works

ただ単にディレクトリに入っているだけです。

sed -i.bk -e '42,43d' -e "72aif host_machine.cpu_family().startswith('arm')\n add_project_arguments('-mfpu=neon', language : ['c', 'cpp'])\nendif\n" meson.build
sed -i.bk '52d' video_output.cpp

ここが難関というか気を付けなければなりません。呪文のように見えるかもしれませんが、このコマンドの操作よりも、なにをするべきか書いていきます。まず1行目はある記述についての削除を行っています。コマンドだとアップデートにより行数が変わったりすると漬けないので手動で削除することをおすすめします。ではまず、meson.buildファイルをnanoやviで開いて作業を行います。

nano meson.build
sources = [
  'audio_output.cpp',
  'audio_output.h',
  'libavsmash_source.cpp',
  'libavsmash_source.h',
  'lsmashsource.cpp',
  'lsmashsource.h',
  'lwlibav_source.cpp',
  'lwlibav_source.h',
  'video_output.cpp',
  'video_output.h',
  '../common/audio_output.c',
  '../common/audio_output.h',
  '../common/cpp_compat.h',
  '../common/decode.c',
  '../common/decode.h',
  '../common/libavsmash.c',
  '../common/libavsmash.h',
  '../common/libavsmash_audio.c',
  '../common/libavsmash_audio.h',
  '../common/libavsmash_audio_internal.h',
  '../common/libavsmash_video.c',
  '../common/libavsmash_video.h',
  '../common/libavsmash_video_internal.h',
  '../common/lwindex.c',
  '../common/lwindex.h',
  '../common/lwlibav_audio.c',
  '../common/lwlibav_audio.h',
  '../common/lwlibav_audio_internal.h',
  '../common/lwlibav_dec.c',
  '../common/lwlibav_dec.h',
  '../common/lwlibav_video.c',
  '../common/lwlibav_video.h',
  '../common/lwlibav_video_internal.h',
  '../common/lwsimd.c',
  '../common/lwsimd.h',
  '../common/osdep.c',
  '../common/osdep.h',
  '../common/progress.h',
  '../common/qsv.c',
  '../common/qsv.h',
  '../common/resample.c',
  '../common/resample.h',
  '../common/utils.c',
  '../common/utils.h',
  '../common/video_output.c',
  '../common/video_output.h'
]

次に最初のほうにあるsources =[]のところを確認します。その中にある、

'../common/lwsimd.c',
'../common/lwsimd.h',

この2行を削除します。まだ操作があるのでエディタを閉じないでください。

次に、下のほうに行くと以下のような記述があるかと思います。

if host_machine.cpu_family().startswith('x86')
  add_project_arguments('-mfpmath=sse', '-msse2', language : ['c', 'cpp'])
endif

if host_machine.system() == 'windows'
  add_project_arguments('-D__USE_MINGW_ANSI_STDIO', language : ['c', 'cpp'])
endif

このちょうど真ん中のところに以下の一文を追加してください。

if host_machine.cpu_family().startswith('arm')

add_project_arguments('-mfpu=neon', language : ['c', 'cpp'])

endif

追記して以下の形になれば大丈夫です。

if host_machine.cpu_family().startswith('x86')
  add_project_arguments('-mfpmath=sse', '-msse2', language : ['c', 'cpp'])
endif
if host_machine.cpu_family().startswith('arm')
add_project_arguments('-mfpu=neon', language : ['c', 'cpp'])
endif
if host_machine.system() == 'windows'
  add_project_arguments('-D__USE_MINGW_ANSI_STDIO', language : ['c', 'cpp'])
endif

これで変更を保存します。

次にvideo_output.cppも編集します

nano video_output.cpp

ここらへんの記述がある場所を探してください。最初のほうです。

extern "C"
{
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>
#include <libavutil/imgutils.h>
#include <libavutil/mem.h>
}

#include "../common/lwsimd.h"

#include "video_output.h"

#if (LIBAVUTIL_VERSION_MICRO >= 100) && (LIBSWSCALE_VERSION_MICRO >= 100)
#define FFMPEG_HIGH_DEPTH_SUPPORT 1
#else
#define FFMPEG_HIGH_DEPTH_SUPPORT 0
#endif

この中の以下の一文を削除します。

#include "../common/lwsimd.h"

こんな感じになれば大丈夫です。

extern "C"
{
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>
#include <libavutil/imgutils.h>
#include <libavutil/mem.h>
}


#include "video_output.h"

#if (LIBAVUTIL_VERSION_MICRO >= 100) && (LIBSWSCALE_VERSION_MICRO >= 100)
#define FFMPEG_HIGH_DEPTH_SUPPORT 1
#else
#define FFMPEG_HIGH_DEPTH_SUPPORT 0
#endif

変更を保存してください。

これでビルドに進めますのでビルドを行います。あとは操作通りやれる場所なので一気に行きます。

CC=gcc CXX=gcc LD=gcc LDFLAGS="-Wl,-Bsymbolic,-L/opt/vc/lib" meson build
cd build
ninja -v
sudo ninja install
sudo ldconfig

これでエラーがなければL-SMASH-Worksの設定は完了ですが、Orangepiだと、mesonが古いといわれたので更新します。mesonはビルド用ツールです。参考までに更新方法を載せておきます。

mesonの更新

以下のコマンドでサクッと更新できます。

sudo apt purge meson
sudo apt-get install pyhton3-pip python3-setuptools
python3 -m pip install meson

あとは一応ですが、再起動をしておくといいと思います。

sudo reboot

次はjoin_logo_scp本体の導入です。

join_logo_scp

CMカットツールになるjoin_logo_scpの導入です。それに加えて、このツールを導入することにより、tsファイルを入力として、一括でffmpegを用いたエンコードまでを行うことができます。CMカット用avsファイルのみ出力も各ツールで行うことができます。

では早速導入していきます。

このサイト通りホームディレクトリでL-SMASH-Worksのコンパイルをしており、以下のコマンドは入力されており、フォルダが存在するとします。読み飛ばしていた方以下のコマンドを入力してください。

git clone https://github.com/tobitti0/chapter_exe.git -b arm-test

これはARMのCPU用なので先にcloneしておきます。

次に以下のコマンド実行します。

cd
git clone --recursive https://github.com/tobitti0/JoinLogoScpTrialSetLinux.git
cd JoinLogoScpTrialSetLinux/modules/logoframe/src
make
cd && cp JoinLogoScpTrialSetLinux/modules/logoframe/src/logoframe JoinLogoScpTrialSetLinux/modules/join_logo_scp_trial/bin/logoframe
cd JoinLogoScpTrialSetLinux/modules/join_logo_scp/src
make
cd && cp JoinLogoScpTrialSetLinux/modules/join_logo_scp/src/join_logo_scp JoinLogoScpTrialSetLinux/modules/join_logo_scp_trial/bin/join_logo_scp
cd chapter_exe/src
make
cd && cp chapter_exe/src/chapter_exe JoinLogoScpTrialSetLinux/modules/join_logo_scp_trial/bin/chapter_exe
cd JoinLogoScpTrialSetLinux/modules/join_logo_scp_trial

Rapberry Piであれば問題ないのですが、OrangePiだと詳しいエラーメッセージ覚えていないのですが、"-mfpu=neon"がどうこう言われたので、同じエラーが出た場合は以下を試してみてください。chapter_exeのarm_test版のMakeFileがあるディレクトリに移動し、Makefileを編集します。

cd chapter_exe/src
nano MakeFile
PROGRAM = chapter_exe
OBJS = chapter_exe.o mvec.o

CC = gcc
CFLAGS = -O3 -I/usr/local/include/avisynth -mfpu=neon -ffast-math -Wall -Wshadow -Wempty-body -I. -std=gnu99 -fpermissive -fomit-frame-pointer -s -fno-tree-vectorize 
LDLAGS = -ldl -lstdc++ -pthread

.SUFFIXES: .c .o

$(PROGRAM): $(OBJS)
	$(CC) -o $(PROGRAM) $^ $(LDLAGS)

.cpp.o:
	$(CC) $(CFLAGS) -c $<

.PHONY: clean
clean:
	$(RM) $(PROGRAM) $(OBJS)

これのCFLAGS=の行にある、"-mfpu=neon"の記述を削除してください。あとは上に書いた通りの手順でmakeしてcpしてもらえれば、大丈夫かと思います。

あとはmakeなどもエラーが終わったという前提で、JoinLogoScpTrialSetLinux/modules/join_logo_scp_trialのディレクトリを確認してもらうと、

$ ls
JL         bin   node_modules       package.json  setting  yarn.lock
README.md  logo  package-lock.json  result        src      説明.txt

上記のようになっているかと思うのですが、このlogoフォルダに、ロゴデータ(.lgd)を入れてください。これは、windowsのJLSと一緒ですね。ロゴデータの保存は各自で行ってください。

追記:2020/9/11
ロゴの簡単な生成方法を掲載しました。

備忘録として自分の実行したコマンドを残しておきます。

cp -r /mnt/nas/others/logo . 

インストールを行います。以下のコマンドをlogoフォルダがあるpackage.jsonと同じ階層で行います。

sudo npm install
sudo npm link
jlse --help

最後のコマンドで以下の記述が出ていればインストールはできています。

$ jlse --help
オプション:
  --version     バージョンを表示                                          [真偽]
  --input, -i   path to ts file                                  [文字列] [必須]
  --filter, -f  enable to ffmpeg filter output        [真偽] [デフォルト: false]
  --encode, -e  enable to ffmpeg encode               [真偽] [デフォルト: false]
  --target, -t  select encord target
            [選択してください: "cutcm", "cutcm_logo"] [デフォルト: "cutcm_logo"]
  --option, -o  set ffmpeg option                      [文字列] [デフォルト: ""]
  --name, -n    set encordet file name                 [文字列] [デフォルト: ""]
  --remove, -r  remove avs files                      [真偽] [デフォルト: false]
  --help        ヘルプを表示                                              [真偽]

npm install のときにエラーが出ていた場合は、もしかしたらnodejsのバージョンがあっていないのかもしれません。以下のコマンドを試してみましょう。

sudo apt-get install npm nodejs
sudo npm install n -g
sudo n 10   //stableでもいいかもしれないけど未検証
sudo apt purge -y nodejs npm
sudo reboot

私の環境だと、nodeは10.21.0でしたがインストールできていました。8系だとエラーが出てダメでした。

delogo-AviSynthPlus-Linux

最後にjoin_logo_scpのロゴ消しモジュールも作者様が移植してくださっているので、そちらも導入します。

cd /tmp
git clone https://github.com/tobitti0/delogo-AviSynthPlus-Linux.git
cd delogo-AviSynthPlus-Linux/src
make
sudo make install

私の場合はここでは特にエラーも出ませんでした。これでjoin_logo_scpの環境のインストールは終わりです。

使い方

基本的には作者のtobitti0氏のgithubをご覧ください。ただこの部分は更新されていないのか、tobitti0氏がdocker用に作っているからか、このリンクに書かれている"npm -i~"の形式では動かず、"jlse -i"といった形で使用します。参考までに私はこんな風に使っています。

jlse -i "/mnt/nashdd/test/rokuga/hoge.ts" -e -t cutcm_logo -o " -c:v h264 -vf pullup=jb=54 -preset veryfast -acodec aac -b:v 4M -aspect 16:9 -r 24000/1001 -ab 256K"

先頭がjlseになるだけでオプションはgithubに書いてあるものを使えるみたいなので、そちらを参照してください。そこにも書いているのですが、気を付けたほうがいいことがエンコードオプションを書いているところは、先頭は必ずスペースを一つ入れておくことです。上の例の場合だと 「-c:v」と先頭の「"」との間にスペースが必ず必要です。

他に気を付けたいというか動作確認するうえであったのが、タイトルに"!"が入っているとターミナルのヒステリ機能が働いてしまい、以下のようなエラーが出ることがあります。

bash: !': event not found

こんなメッセージが出たら、以下のコマンドを試してもう一度実行してみてください。

set +H

ターミナルから実行しているとき限定なので、プログラム上からコマンドを実行してもヒステリ機能は機能しないので、動作確認の時に入力するだけで大丈夫です。

これでLinuxへのjoin_logo_scpのインストールは完了です。お疲れ様でした。

なるべく躓いたところも紹介はしましたが、わかりにくいところなどあればコメントで言っていただければ修正なり加筆なりします。

追記(2020/10/05)EPGStationと連携して自動エンコードを行う方法についてページを作成しました。この設定をしなくても、コマンドライン上で手動での実行は可能なので支障はありません。EPGStationと連携させたい場合にご覧ください。

EPGStationと連携

join_logo_scpを用いたハードウェアエンコードと録画を同時に行っても問題ないかを検証してみました。I/O負荷やCPU使用率、温度についてデータを取り詳しく検証しています。

システムパフォーマンスを測ってみた

謝辞

join_logo_scpのオリジナルの製作者Yobi氏、nodejsに移植をされたsogaani氏、今回のjoin_logo_scpおよびロゴ消しモジュールの作者tobitti0移植に深く感謝いたします。掲示板でも数々の助力、対応をしていただきまして、重ねて感謝申し上げます。

感想

私もWindowsでかつてCMカット、ロゴ消し、エンコードをしていましたが、Windows買うにもお金はかかるし、夜に動かしてたらファンうるさいしということで、Linuxを使いつつできればRaspberryPiのようなSBCで動くCMカット環境を望んでいました。同様の理由でLinuxでテレビ録画っていう環境に移行し、Raspberry Piでテレビ録画サーバーを作ったわけです。

しかしCMカットについては調べてもネットの海にはCMCut4UかComSkipの話題しかない。これはもっともっと調べるしかないよねっていうことで、sogaani氏のJLSを見つけてgithubにある通りやってもダメでなんとかできないかなと、掲示板で質問したところ、tobitti0氏のgithubをご紹介いただき、本人に不明な点なども助けていただきました。気が向いたらまとめますとおしゃっていましたが、さすがにご本人にこれ以上していただくわけにもと思い、このページを書くに至りました。頑張って当時躓いたことを詳しく書いたのでわかりにくくなってしまったかもしれませんが、続く誰もがインストールできるように頑張ったつもりです。tobitti0氏、本当にありがとうございました。Linuxで幸せなDTVライフを送れそうです。

ネットの海でもGoogleに入力するだけじゃ得られない情報もたくさんあるなと思い始めました。そんな誰も書いてない内容の記事をたくさん書いていきたいですね。そして書いたとたんに似たような記事が増えてきたらきっとうれしいんだろうなぁ。と本当にどうでもいいこと書いてしまいましたね。

では皆様、よいDTVライフを!

2件のコメント

  1. こちらのサイトを見て、ぜひ試してみたいと始めたのですが、
    L-SMASH-Worksのインストールでつまっております。
    ninja で以下のエラーがでて、検索しても解決方法がみあたらなく、
    途方にくれております…
    pi@raspberrypi:~/L-SMASH-Works/AviSynth/build $ /usr/bin/ninja
    [1/2] Compiling C object 'lsmashsource@sha/.._common_lwindex.c.o'.
    FAILED: lsmashsource@sha/.._common_lwindex.c.o
    gcc -Ilsmashsource@sha -I. -I.. -I/usr/local/include/avisynth -I/usr/local/include -fvisibility=hidden -fdiagnostics-color=always -DNDEBUG -pipe -Wall -Winvalid-pch -std=c99 -O3 -Wno-sign-compare -DXXH_INLINE_ALL -D_FILE_OFFSET_BITS=64 -mfpu=neon -fPIC -MD -MQ 'lsmashsource@sha/.._common_lwindex.c.o' -MF 'lsmashsource@sha/.._common_lwindex.c.o.d' -o 'lsmashsource@sha/.._common_lwindex.c.o' -c ../../common/lwindex.c
    ../../common/lwindex.c: In function ‘create_index’:
    ../../common/lwindex.c:2553:78: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘nb_index_entries’
    if( adhp->dv_in_avi == 1 && format_ctx->streams[ adhp->stream_index ]->nb_index_entries == 0 )
    ^~
    ../../common/lwindex.c:2601:58: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘index_entries’
    temp = (AVIndexEntry *)av_realloc( stream->index_entries, allocated_size );
    ^~
    ../../common/lwindex.c:2617:27: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘index_entries’
    stream->index_entries = temp;
    ^~
    ../../common/lwindex.c:2618:27: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘index_entries_allocated_size’
    stream->index_entries_allocated_size = allocated_size;
    ^~
    ../../common/lwindex.c:2619:27: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘nb_index_entries’
    stream->nb_index_entries = i;
    ^~
    ../../common/lwindex.c:2625:58: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘index_entries’
    temp = (AVIndexEntry *)av_realloc( stream->index_entries, allocated_size );
    ^~
    ../../common/lwindex.c:2642:27: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘index_entries’
    stream->index_entries = temp;
    ^~
    ../../common/lwindex.c:2643:27: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘index_entries_allocated_size’
    stream->index_entries_allocated_size = allocated_size;
    ^~
    ../../common/lwindex.c:2644:27: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘nb_index_entries’
    stream->nb_index_entries = i;
    ^~
    ../../common/lwindex.c:2650:34: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘index_entries’
    av_freep( &stream->index_entries );
    ^~
    ../../common/lwindex.c:2651:23: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘index_entries_allocated_size’
    stream->index_entries_allocated_size = 0;
    ^~
    ../../common/lwindex.c:2652:23: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘nb_index_entries’
    stream->nb_index_entries = 0;
    ^~
    ../../common/lwindex.c:2661:108: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘nb_index_entries’
    print_index( index, "\n", stream_index, AVMEDIA_TYPE_VIDEO, stream->nb_index_entries );
    ^~
    ../../common/lwindex.c:2663:43: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘nb_index_entries’
    for( int i = 0; i nb_index_entries; i++ )
    ^~
    ../../common/lwindex.c:2664:57: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘index_entries’
    write_av_index_entry( index, &stream->index_entries[i] );
    ^~
    ../../common/lwindex.c:2665:28: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘nb_index_entries’
    else if( stream->nb_index_entries > 0 )
    ^~
    ../../common/lwindex.c:2667:72: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘index_entries_allocated_size’
    vdhp->index_entries = (AVIndexEntry *)av_malloc( stream->index_entries_allocated_size );
    ^~
    ../../common/lwindex.c:2670:43: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘nb_index_entries’
    for( int i = 0; i nb_index_entries; i++ )
    ^~
    ../../common/lwindex.c:2672:47: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘index_entries’
    AVIndexEntry *ie = &stream->index_entries[i];
    ^~
    ../../common/lwindex.c:2676:51: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘nb_index_entries’
    vdhp->index_entries_count = stream->nb_index_entries;
    ^~
    ../../common/lwindex.c:2682:108: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘nb_index_entries’
    print_index( index, "\n", stream_index, AVMEDIA_TYPE_AUDIO, stream->nb_index_entries );
    ^~
    ../../common/lwindex.c:2684:43: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘nb_index_entries’
    for( int i = 0; i nb_index_entries; i++ )
    ^~
    ../../common/lwindex.c:2685:57: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘index_entries’
    write_av_index_entry( index, &stream->index_entries[i] );
    ^~
    ../../common/lwindex.c:2686:28: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘nb_index_entries’
    else if( stream->nb_index_entries > 0 )
    ^~
    ../../common/lwindex.c:2690:72: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘index_entries_allocated_size’
    adhp->index_entries = (AVIndexEntry *)av_malloc( stream->index_entries_allocated_size );
    ^~
    ../../common/lwindex.c:2693:43: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘nb_index_entries’
    for( int i = 0; i nb_index_entries; i++ )
    ^~
    ../../common/lwindex.c:2695:47: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘index_entries’
    AVIndexEntry *ie = &stream->index_entries[i];
    ^~
    ../../common/lwindex.c:2699:51: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘nb_index_entries’
    adhp->index_entries_count = stream->nb_index_entries;
    ^~
    ../../common/lwindex.c: In function ‘lwlibav_import_av_index_entry’:
    ../../common/lwindex.c:3457:24: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘index_entries’
    av_free( stream->index_entries );
    ^~
    ../../common/lwindex.c:3458:15: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘index_entries’
    stream->index_entries = dhp->index_entries;
    ^~
    ../../common/lwindex.c:3459:15: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘nb_index_entries’
    stream->nb_index_entries = dhp->index_entries_count;
    ^~
    ../../common/lwindex.c:3460:15: error: ‘AVStream’ {aka ‘struct AVStream’} has no member named ‘index_entries_allocated_size’
    stream->index_entries_allocated_size = dhp->index_entries_count * sizeof(AVIndexEntry);
    ^~
    ninja: build stopped: subcommand failed.

    どうにかお知恵を拝借できたら助かります。

    1.  コメントありがとうございます。何を対処として実行したかも書かれていないので冗長になってしまいますがご容赦ください。
      また私の環境ではL-SMASH-Worksを再度ダウンロードし、ビルドしただけでは状況の再現ができませんでした。そのため以下は憶測の内容が多分に含まれます。

       導入に際して環境によって違いがどうしても発生しやすく、私が試した環境でもOSのバージョンが違うだけでも異なるエラーが出るぐらいなので初めに環境について確認させてください。
      piになっているのでRaspberry Piであることには間違いないと思うのですが、

      1. Raspberry Piの何を使っているか(4Bとか3B+とか)
      2. OSは何かと、動作モード(64bitか32bitか)、加えていつぐらいのOSを書き込んだか

       あたりの情報もあると何か考える助けになるかもしれません。また後続の方もそういう情報があったほうが助かる場合もありますね。ただデバイス固有の問題やOSのバージョンに関係しない場合もあると思うので、上記についてはこの返信で解決しなかったら教えていただければ大丈夫です。

       前置きが長くなってしまいましたが、少しきになるのが、/usr/bin/ninjaのように直接ninjaを指定しているのはどうしてでしょうか。
      私はLinuxのファイル間の依存関係などはそこまで詳しくないので、その状態でのバイナリの実行に問題がないかが一切わからないのでまずはninjaを実行する際は
      /usr/nib/ninja ではなく、 ninjaのみで実行していただいたほうが私の導入時のコマンドとも整合性が取れるのでそちらの方がトラブルも解決しやすいです。またビルドの詳細を見るために「ninja -v」と実行することで詳細なログが得られるのでエラー解決の手掛かりになります。

      逆に、「ninja -v」などでninjaというコマンドが見つからないなどのエラーが出た場合はパスが通っていないや環境が汚れてしまっていてOSが本来の動作をしていない可能性もあります。その場合は試されているかと思いますが、再起動すると解決する場合があります。特に「apt purge」のようなコマンドを実行すると再起動しないといけないので気を付けてください。

       さて、上記のninjaまわりの対処をしても解決しない場合は、調べた限りになりますが、AVStrem関係のエラーのようですがどうも特定ライブラリと該当ツール(この場合はL-SMASH-Works)のバージョンの不整合によるものの可能性が高いです。私の環境で再現しなかったのもライブラリ関係は再度インストールをしていないためだと考えられます。調べて初めて知ったのですが、L-SMAH-Worksのビルドにはffmpegライブラリが用いられているみたいで、更新によって使用するライブラリが変わったりしているようです。そのため最新のffmpegをビルドしていると思いますが、古いバージョンで試してみるとうまくいくかもしれません。あとは説明通りにやっていればないとは思いますがaptでインストールできるffmpegは使えないのは注意してください。

      また、今回このような報告があったので以下のページにソースをアップロードしました。お手数ですがこちらを使ってお試しください。

マゲ へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。