web-dev-qa-db-ja.com

avconvにパイプされたimagemagick画像変換が失敗する

あらゆる種類の画像(フォーマット、サイズなど)を取得し、avconvを使用してビデオを作成するスクリプトを作成しようとしています。私はそれを一連のjpg(すべて同じサイズですが)で動作させることができました。現在、変換を使用して、すべての画像のサイズと形式を同じにしてビデオを作成しようとしています。これが私がそれをする方法です:

(for J in $(ls "$1/"* 2> /dev/null); do
     convert "$J" -resize 640x480 -gravity center \
             -size "$FORMAT" -fill black -extent 640x480 jpg jpeg:-
done) | avconv -f image2pipe -r 1/5 -c:v mjpeg -i - \
               -vcodec libx264 -r 20 -f mpegts video.mpeg

Avconvが戻る一連の画像があります。

Input stream #0:0 frame changed from size:640x480 fmt:yuvj420p to size:160x120 fmt:yuvj422p
Input stream #0:0 frame changed from size:160x120 fmt:yuvj422p to size:320x240 fmt:yuvj422p
Input stream #0:0 frame changed from size:320x240 fmt:yuvj422p to size:88x128 fmt:yuvj420p
[mjpeg @ 0x101838800] only 8 bits/component accepted
 Error while decoding stream #0:0
 Input stream #0:0 frame changed from size:88x128 fmt:yuvj420p to size:120x160 fmt:yuvj420p

確認したところ、変換を使用しているだけで画像に問題がないように見えます。 avconvが機能するために画像を完全に同一にするための変換で何かが欠けていると思います。しかし、私はそれを本当に見つけることができません

あなたの助けをありがとう!

編集

したがって、調査した結果、これは出力画像の解像度やサンプリング比が同じでないことが原因であると思われます。だから私はこれを試しました:

(for J in $(ls "$1/"* 2> /dev/null); do
    convert "$J" -background '#000000' -resize "640x480" 
                 -gravity center -extent "640x480" -sampling-factor '4:2:2' 
                 -resample '72x72' jpeg:-
done) | 
avconv -f image2pipe -r 1/5 -c:v mjpeg -i - 
       -vcodec libx264 -r 30 "foo.mpeg"

それでも成功しません...

Input stream #0:0 frame changed from size:640x480 fmt:yuvj422p to size:160x120 fmt:yuvj422p
Input stream #0:0 frame changed from size:160x120 fmt:yuvj422p to size:320x240 fmt:yuvj422p
Input stream #0:0 frame changed from size:320x240 fmt:yuvj422p to size:88x128 fmt:yuvj420p
[mjpeg @ 0x101838800] only 8 bits/component accepted
Error while decoding stream #0:0
Input stream #0:0 frame changed from size:88x128 fmt:yuvj420p to size:120x160 fmt:yuvj420p

パイプ::入力/

これが私が使用する画像です:

お役に立てれば...

3
charly

多くの検索の後、私はついに何かが機能していることを発見しました(少なくとも私のいくつかのテストファイルでは):

convert "$J" -background '#000000' -resize "$FORMAT" \
        -gravity center -extent "$FORMAT" -strip \
        -sampling-factor '4:2:2' -type TrueColor jpeg:- | \
avconv -f image2pipe -r 1/"$DURATION" -c:v mjpeg -i - \
       -vcodec libx264 -r 20 -f mpegts "$RESULT_FILE"

重要なオプションは次のとおりです。

  • -strip入力からすべての余分な情報を削除します(たとえば、カラープロファイルまたはいくつかのEXIFデータがありました)これは明らかにavconvに問題を引き起こしていました
  • -sampling-factor '4:2:2'これにより、jpegサンプリング係数が4:2:2に修正されます(4:2:2よりも賢明な選択があると思われる場合は教えてください)
  • -type TrueColorこれはテストされていませんが、グレースケールの画像は異なる形式になり、jpegに保持されます。このオプションは、すべての画像が同じ色分けを使用するようにTrueColorsに強制的に変換します。

これは私の問題ftmを解決しました。他に何か見たら教えてください... Thx

3
charly