makoto_fujimotoのblog

株式会社進角
代表 藤本信のブログです
どうぞよろしくお願いします

ffmpegで動画ファイルの詳細情報を取得する際にファイル名がSJISの場合ファイル指定に
難航したので解決策のメモ。

例えばWindows系ファイルシステムがマウントされたLinux系サーバでは日本語ファイル名や
フォルダ名が以下の様に文字化けしてしまうことがあります(1行目)。ファイル名は"コ ピー.mp4"

$ ls -l
-rw-rw-r--  1 fujimoto fujimoto 111044022 11月  9 16:46 2015 ?R ?s?[.mp4
-rw-rw-r--  1 fujimoto fujimoto 111044022 11月  9 16:46 2015 ああ あ.mp4
-rw-rw-r--  1 fujimoto fujimoto 111044022 11月  9 16:46 2015 あああ.mp4

これを以下の様にffmpegにコピペしても旨く行きません
$ ffmpeg -i  ?R ?s?[.mp4
$ ffmpeg -i  "?R ?s?[.mp4"
$ env LANG=ja_JP.SJIS ffmpeg -i "?R ?s?[.mp4"
ffmpeg version N-81489-ga37e6dd Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-17)
  configuration: --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libx264
  libavutil      55. 29.100 / 55. 29.100
  libavcodec     57. 54.101 / 57. 54.101
  libavformat    57. 48.101 / 57. 48.101
  libavdevice    57.  0.102 / 57.  0.102
  libavfilter     6. 57.100 /  6. 57.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  1.100 /  2.  1.100
  libpostproc    54.  0.100 / 54.  0.100
?R ?s?[.mp4: No such file or directory


なんとか直接ファイル名を渡す方法は無いものか・・・

ということでlsやfindで取得したファイル名をそのままffmpegに渡す方法でうまくいきました。
ただしリストの何番目という情報を最初に把握する必要があり、あまりスマートな方法では無いかもしれません。

カレント内のファイルの場合
$ ls -1
$ ffmpeg -i "`ls -1|sed -n 1p`"

カレント内のサブフォルダのファイルを指定する場合
$ find . -type f|grep mp4
$ ffmpeg -i "`find . -type f|grep mp4|sed -n 1p`"

動画情報の取得に成功した場合の結果
$ ffmpeg -i "`find . -type f|grep mp4|sed -n 8p`"
ffmpeg version N-81489-ga37e6dd Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-17)
  configuration: --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libx264
  libavutil      55. 29.100 / 55. 29.100
  libavcodec     57. 54.101 / 57. 54.101
  libavformat    57. 48.101 / 57. 48.101
  libavdevice    57.  0.102 / 57.  0.102
  libavfilter     6. 57.100 /  6. 57.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  1.100 /  2.  1.100
  libpostproc    54.  0.100 / 54.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from './/Rs[.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp41mp42isom
    creation_time   : 2014-07-18T07:40:50.000000Z
  Duration: 00:00:44.08, start: 0.000000, bitrate: 20154 kb/s
    Stream #0:0(deu): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 2 kb/s (default)
    Metadata:
      creation_time   : 2014-07-18T07:40:50.000000Z
      handler_name    : Core Media Audio
    Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080, 20146 kb/s, SAR 1:1 DAR 16:9, 29.97 fps, 29.97 tbr, 30k tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2014-07-18T07:40:50.000000Z
      handler_name    : Core Media Video
At least one output file must be specified

iptablesのパケットフィルタリングを使用したブリッジ型の簡易ファイアウォールを構築した際のメモです。NICをブリッジ構成とすることでHUBとして機能しますので、ネットワークゾーンを分ける必要がなく、クライアントの設定変更も必要としないので導入が簡単です。

【検証環境】
OS: CentOS 6.7
NIC: 二枚構成になっていて認識している状態
ネットワーク構成: [ RT ]----eth0[ Firewall (br0) ]eth1----[ Client ]
IPアドレス:
 Firewall 192.168.123.100 (ブリッジなので一つだけ)
  Client 192.168.123.101
  Router 192.168.123.254

【設定手順】

  1. NICのブリッジ設定
    ブリッジIDの登録
    # brctl addbr br0

  2. NICの設定
    # vi ifcfg-br0
    DEVICE=br0
    BOOTPROTO=none
    ONBOOT=yes
    ARPCHECK=no
    TYPE=Bridge
    IPADDR=192.168.123.100
    NETMASK=255.255.255.0

    # vi ifcfg-eth0
    DEVICE=eth0
    BOOTPROTO=none
    ONBOOT=yes
    ARPCHECK=no
    TYPE=Ethernet
    BRIDGE=br0


    # vi ifcfg-eth1
    DEVICE=eth1
    BOOTPROTO=none
    ONBOOT=yes
    ARPCHECK=no
    TYPE=Ethernet
    BRIDGE=br0

    # service network restart

    # ifconfig
    br0       Link encap:Ethernet  HWaddr 00:50:43:01:6B:D9
              inet addr:192.168.123.100  Bcast:192.168.155.255  Mask:255.255.255.0
              inet6 addr: fe80::250:43ff:fe01:6bd9/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:19312 errors:0 dropped:0 overruns:0 frame:0
              TX packets:1414 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:1076922 (1.0 MiB)  TX bytes:259095 (253.0 KiB)
    eth0      Link encap:Ethernet  HWaddr 9C:B6:54:A9:DE:8D
              inet6 addr: fe80::9eb6:54ff:fea9:de8d/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:19522 errors:0 dropped:0 overruns:0 frame:0
              TX packets:1634 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:1450412 (1.3 MiB)  TX bytes:293545 (286.6 KiB)
              Interrupt:18
    eth1      Link encap:Ethernet  HWaddr 00:50:43:01:6B:D9
              inet6 addr: fe80::250:43ff:fe01:6bd9/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:300 errors:0 dropped:0 overruns:0 frame:0
              TX packets:15111 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:48752 (47.6 KiB)  TX bytes:931317 (909.4 KiB)
    lo        Link encap:Local Loopback
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

    # brctl show
    bridge name     bridge id                         STP enabled     interfaces
    br0                  8000.005043016bd9       no                     eth0
                                                                                        eth1

  3. ブリッジ疎通確認
    イーサケーブルですが、ファイアウォールのeth0をWAN側にeth1をClientに数珠つなぎした上で、iptablesのポリシー設定はすべてACCEPTにしておきます。
    (1) まずはClientからFirewallへ
    # ping 192.168.123.100
    PING 192.168.123.100 (192.168.123.100) 56(84) bytes of data.
    64 bytes from 192.168.123.100: icmp_seq=1 ttl=64 time=0.310 ms
    64 bytes from 192.168.123.100: icmp_seq=2 ttl=64 time=0.280 ms
    64 bytes from 192.168.123.100: icmp_seq=3 ttl=64 time=0.277 ms
    64 bytes from 192.168.123.100: icmp_seq=4 ttl=64 time=0.281 ms
    ・・・
    (2) ClientからFirewall越しのルーターへ
    # ping 192.168.123.254
    PING 192.168.123.254 (192.168.123.254) 56(84) bytes of data.
    64 bytes from 192.168.123.254: icmp_seq=1 ttl=255 time=0.399 ms
    64 bytes from 192.168.123.254: icmp_seq=2 ttl=255 time=0.269 ms
    64 bytes from 192.168.123.254: icmp_seq=3 ttl=255 time=0.270 ms
    64 bytes from 192.168.123.254: icmp_seq=4 ttl=255 time=0.280 ms
    ・・・
    Clientからファイアウォール越しにルータなどのIPアドレスにpingが通ればブリッジ設定はOKです。

  4. カーネルパラメータの変更
    パケットフォワードの許可とiptablesでブリッジのパケットを扱えるようにします。
    (1) /etc/sysctl.confに以下パラメータを追加
    net.ipv4.ip_forward = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-arptables = 1
    (2) 設定を反映
    # sysctl -p

  5. iptablesの検証1
    取り急ぎFirewallのNIC間を流れるパケットの制御が有効か確かめるためにFORWARDチェインをすべてDROPしてみます。
    (1) /etc/sysconfig/iptablesを編集
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD DROP [0:0]
    :OUTPUT ACCEPT [0:0]
    COMMIT

    (2) iptablesの再起動
    # service iptables restart
    (3) Clientからpingが通らなくなったことを確認
    ping 192.168.123.100
    ping 192.168.123.254


  6. iptablesの検証2
    ping(ICMP)だけ通してみる
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD DROP [0:0]
    :OUTPUT ACCEPT [0:0]
    -A FORWARD -p icmp -j ACCEPT
    COMMIT
    # service iptables restart
    これでClientからFirewall越しにpingが通ればパケットフィルタリング制御が有効に働いていることになります。

  7. iptablesの実際的な設定
    社内LANなどで使用するパソコンが外部の不要なサービスにアクセスすることを防止するため、一般的に使用されるホワイトリストを登録する例です。
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD DROP [0:0]
    :OUTPUT ACCEPT [0:0]
    -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
    -A FORWARD -p icmp -j ACCEPT
    -A FORWARD -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
    -A FORWARD -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
    -A FORWARD -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT
    -A FORWARD -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT
    -A FORWARD -m state --state NEW -m udp -p udp --dport 123 -j ACCEPT
    -A FORWARD -m state --state NEW -m tcp -p tcp --dport 110 -j ACCEPT
    -A FORWARD -m state --state NEW -m tcp -p tcp --dport 995 -j ACCEPT
    -A FORWARD -m state --state NEW -m tcp -p tcp --dport 587 -j ACCEPT
    -A FORWARD -m state --state NEW -m tcp -p tcp --dport 465 -j ACCEPT
    COMMIT
    # service iptables restart

  8. プロキシ―の設定について
    例えばマルウェア等のダウンロードを防止するために、HTTPプロキシ―によるゲートウェイ型のウィルスチェックソフトを併用することも可能です。この場合もブリッジ型ネットワーク構成であればクライアントのブラウザ設定を変える必要はありません。以下はこのFirewall自身をHTTPのウィルスチェックゲートウェイとする設定例です。
    (1) HTTPのプロキシサーバを立てる
    8080ポートを使用(ウィルスチェックソフトの設定になるので詳細は割愛)
    (2) NATの設定
    外部の80にリクエストが投げられると8080で動作するプロキシ(ウィルスチェック)が処理を行います。
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD DROP [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
    COMMIT

    *nat
    -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
    COMMIT

このページのトップヘ