17647


過去に[ffmpegの`make`について質問しました。](https://ja.stackoverflow.com/questions/17376/ffmpeg%E3%81%AEmake%E3%81%A7%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%A4%E3%81%84%E3%81%A6)  
そこで頂いた回答を元に、ffmpegの`./configure`に`--extra-cflags='-march=armv6' --extra-
ldflags='-march=armv6'`を指定して`make`しました。

そのffmpegを使って、  
`ffmpeg -i test.mp4 -threads 2 -codec:v libx264 -s:v 1280x720 -aspect:v 16:9
-b:v 256k -map 0 -f segment -segment_format mpegts -segment_time 10
-segment_list stream.m3u8 streamfiles/stream%03d.ts`  
としたところ、`Illegal instruction`というエラーが出ました。  
このエラーはどうやらffmpegではなくてgccからのエラーらしいのですが、どこが引っかかっているのでしょうか？

実行結果

[code]

    ffmpeg version N-75926-gce0834b Copyright (c) 2000-2015 the FFmpeg developers
      built with gcc 4.6 (Debian 4.6.3-14+rpi1)
      configuration: --arch=armel --target-os=linux --enable-shared --enable-gpl --enable-libx264 --enable-nonfree --extra-cflags='-march=armv6' --extra-ldflags='-march=armv6'
      libavutil      55.  3.100 / 55.  3.100
      libavcodec     57.  5.100 / 57.  5.100
      libavformat    57.  3.100 / 57.  3.100
      libavdevice    57.  0.100 / 57.  0.100
      libavfilter     6. 11.100 /  6. 11.100
      libswscale      4.  0.100 /  4.  0.100
      libswresample   2.  0.100 /  2.  0.100
      libpostproc    54.  0.100 / 54.  0.100
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':
      Metadata:
        major_brand     : isom
        minor_version   : 512
        compatible_brands: isomiso2avc1mp41
        encoder         : Lavf56.40.100
      Duration: 00:00:03.28, start: 0.000000, bitrate: 10159 kb/s
        Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 10156 kb/s, 25 fps, 25 tbr, 1200k tbn, 2400k tbc (default)
        Metadata:
          handler_name    : VideoHandler
    Illegal instruction
    
[/code]

使っている機材はRaspberry Pi B+  
OSはRaspbian  
です。


CC BY-SA 3.0
2015-10-14T08:29:41.843
17639
2017-05-26T10:30:14.070
2017-04-13T12:52:38.920
-1
9349
question
raspberry-pi ffmpeg raspbian
Illegal instructionというエラーについて


ここで `illegal instruction` エラーは、おそらく `libx264` の `common/arm/quant-a.S` 中にある  
`rbit` 命令によって出ているのだと思われます。 `rbit` は `armv7` の命令なので  
`raspberry pi 2 model B` なら実行できる (armv7) が  
`raspberry pi model B+` では実行できない (armv6)  
わけです。  
要するに現在の `libx264` は `raspberry pi 2 model B` 向けソースとなっていて  
`raspberry pi model B+` には完全自動対応でない、ってことです。  
オイラが試験したのは libx264-snapshot-20151012-2245 です。

`libx264` を下記のように再構築してみてください。

[code]

    $ make distclean (一度構築済みなら)
    $ ./configure --enable-shared --enable-static --disable-asm
    $ make
    $ sudo make install
    
[/code]

`--disable-asm` によって `quant-a.S` を使わなくなります。  
もしかしたら `libx264` の `./configure` に追加オプション  
`--extra-cflags='-mcpu=arm1176jzf-s' --extra-ldflags='-mcpu=arm1176jzf-s'`  
をつけると `raspberry pi model B+` により適合する機械語を生成するかもしれません。  
(`raspberry pi model B+` の CPU は `arm1176jzf-s` です)

`ffmpeg` のほうに `--extra-cflags` 等は不要だと思います（つけてもかまいませんが）

さてオイラんとこでは `ffmpeg` までビルドはできたんだけどテストできる動画が無いし  
そもそも `raspberry pi 2 model B` なら動いて当たり前っぽいし  
これ以上は試しようがありません。ぜひ結果報告してください。


CC BY-SA 3.0
2015-10-14T11:38:18.353
17647
2015-10-14T11:38:18.353
8589
17639
answer


`libx264`の`./configure` のオプションに`--disable-asm`を追加して再度ビルドしたところ  
`ffmpeg`の`Illegal instruction`が消えました。

`--extra-cflags='-mcpu=arm1176jzf-s' --extra-
ldflags='-mcpu=arm1176jzf-s`も試してみましたが体感で差分はわかりませんでした。

`raspberry pi zero`のCPUが`ARMv6`だったのを忘れてた。


CC BY-SA 3.0
2017-05-26T10:30:14.070
35041
2017-05-26T10:30:14.070
23389
17639
answer