Почему mencoder производит неподвижные изображения, если я пытаюсь закодировать их менее чем 3 кадр/с, в то время как mencoder выходные динамические изображения, если я произвел их на уровне 3 кадр/с или?

В то время как printf печать отформатированная функция, print связывает параметры.

Похож на Вас, должен проверить printf функция (или оба).

Короче говоря это:

printf <format, <parameter1>[, <parameter2>, ...] | text>

Буква % в формате обозначает, здесь прибывает параметр, который должен быть отформатирован как.... Формат может содержать специальные последовательности как \t, \n. Printf не завершается произведенный новой строкой. Если только одному аргументу дают, он обычно печатается, как.


Если это - число, форматирование по умолчанию"%.6g":

CODE  : printf 1.123456789
RESULT: 1.12346

Если, например. $1 1.123456789 это обычно рассматривают как текст, как в:

CODE  : printf $1
RESULT: 1.123456789
CODE  : printf $1+0 # Force conversion to number
RESULT: 1.12346

При предоставлении более затем одного аргумента, первый используется в качестве формата и остальных как параметры. Если к немногим параметрам даны для выполнения шаблона, поведение не определено.

printf "%d %s\n", 123, "hello"
         || | |    |      |
         || | |    |      +----- Parameter 2
         || | |    +------------ Parameter 1
         || | +----------------- Print new-line
         || +------------------- Print parameter 2 as string
         |+--------------------- Print literal space
         +---------------------- Print parameter 1 as digit

printf "%d %s\n", 123, "hello"
# Gives: 123 hello
printf "%d %s\n", "hello", 123
# Gives: 0 123
printf "%d %s\n", 123
# Gives undefined result (according to format one parameter is missing)

И если аргументы даны без какого-либо заполнителя отброшенного:

printf "%d", 123
# Gives: 123
printf "%d", 123, 22
# Gives: 123
printf "%d", 123, 22, "\t", "foo", 5566, 12.55, "\n", "blah"
# Gives: 123

% символ обозначает, "вот спецификация преобразования". Если не допустимая спецификация дана, как в той, которая не определяется awk, поведение является неуказанным. Другой текст рассматривают как обычный текст.

printf "Hello %w", "what"
# Usually: Hello %w
# But no guarantee

printf "ABC", "DEF", "GHI"
# Result: ABC

В Вашем коде Вы часто используете вход из файла как формат для printf. Если те поля не printf форматы они печатаются как обычный текст. Параметры отбрасываются.

# Example, say:
#     $4 = "%d %s\n"
#     $8 = "33.2"
#     $9 = "good"
printf $4, $8, $9
#
# Result: 33 good

# Say:
#     $4 = "14"
#     $8 = "33.2"
#     $9 = "good"
printf $4, $8, $9
#
# Result: 14
printf $4, "\t", $8, "\t", $9
#
# Result: 14

Ваш сценарий отформатировал:

< pool.sam awk '
# 1.
/./ {                   # IF line not empty THEN
    printf $1           #   print field 1
}                       # ENDIF
# 2.
{
    printf $7 + 1, "\t" # printf with format = $7 + 1 and parameter <tab>
}
# 3.
{
    printf $3, "\t"     # printf with format = $3 and parameter <tab>
}
# 4.
{
    # 4.1
    if ($2 != 16) {       # IF field 2 is not 16 THEN
        print "\t", "+";  #    print <tab> + "+" (Terminate with newline)
    } else {              # ELSE
        print "\t", "-";  #    print <tab> + "-" (Terminate with newline)
    }                     # ENDIF

    # 4.2
    {
        printf $4, "\t", length($10) + $4, "\t", "1"
        # printf: pattern="field 4"
        #         parameters=<tab>, length of field 10 + field 4
    }
}
'

Скажите, что Вы имеете:

$ cat pool.sam
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

Это дало бы Вам (использующий нумерующий в коде выше):

1.   printf "1"`                    => `1`
2.   printf 8, "\t"`                => `8`
3.   printf "3", "\t"               => `3`
4.1  print  "\t", "+"               => `<tab>+<new-line>`
4.2  printf "4", "\t", 6, "\t", "1" => `4`

Конечный результат:

183    +
4

Переписывание, которое могло бы получить Вас несколько на пути:

awk '
/./ {
    printf "%s%d\t%d\t", $1, $7 + 1, $3

    if ($2 != 16) {
        printf "+"
    } else {
        printf "-"
    }

    printf "%d\t%d\t1\n", $4, length($10) + $4
}
' pool.sam

Если оператор, (в опасности смутить Вас), может также быть записан сразу как:

printf "%s", $2 != 16 ? "+" : "-"

Читайте на строках формата и printf. Выровнять формат часто очень полезен, как форматирует плаваний и т.д.

right_pad=-10
printf "%*s: %5d\n", right_pad, "vix", 23
printf "%*s: %5d\n", right_pad, "popul", 336
printf "%*s: %5.2f\n", right_pad, "vidi", 42.129542488
printf "%5s %-10d +%d\n", "OK", 33, 44

Вывод:

vix       :    23
popul     :   336
vidi      : 42.13
   OK 33         +44

Самый легкий, по крайней мере, я нахожу его, должен использовать сценарий вместо командной строки при проигрывании вокруг.

3
22.07.2014, 01:34
1 ответ

Я самостоятельно столкнулся с такой же проблемой для MEncoder Redxii-SVN-r37239-4.8.3 и VitualDub 1.10.4. Похоже на проблему с видеофайлом, а не с программным обеспечением. Может быть, вы могли бы рассмотреть возможность использования одного и того же изображения 3 раза подряд с fps=3, чтобы получить эффективный фильм 1 fps.

Лучшие регги

Энди

.
0
27.01.2020, 21:43

Теги

Похожие вопросы