Лично я кодирую при помощи x264. сабж поддерживает crf режим кодирования, что сразу же срубает все сомнения. ставлю crf 16 и всех делов.
Код: |
#!/bin/bash # x264-enc.sh
pass="${1}" rc="${2}" mproptions=("${@:3}")
time="$(date +%F_%H-%M-%S)" name="${time}_${pass}-${rc}.mkv" log="${name}.log" pipe="${time}.y4m" multipasslog="${time}_multipass.log" mplayer="/usr/bin/mplayer" x264="/usr/bin/x264" mpr=($mplayer -fixed-vo -quiet -nosound -nosub -benchmark -lavdopts threads=1 -vo yuv4mpeg:file="${pipe}" -vf-clr "${mproptions[@]}")
xo=( "${pipe}" # Frame-type options: --keyint 750 --min-keyint 25 --bframes 16 --b-adapt 2 --b-pyramid normal --ref 16 --deblock 0:0 # Ratecontrol: --rc-lookahead 250 --aq-mode 1 --aq-strength 1.0 --stats "${multipasslog}" # Analysis: --partitions all --direct auto --weightp 2 --me umh --merange 32 --subme 10 --psy-rd 1.0:0.0 --trellis 2 --no-fast-pskip --no-dct-decimate # Input/Output: --slow-firstpass --threads auto --psnr --ssim ${x} ) mx() { rm -vf "${pipe}" mkfifo "${pipe}"||exit 1 xfo=($x264 "${xo[@]}" ${2} -o "${1}") echo -e "\n${mpr[@]}\n${xfo[@]}\n" "${mpr[@]}" & time "${xfo[@]}" }
rm -v "${multipasslog}"* { time { case "${pass}" in crf) xo+=(--crf "${rc}") mx "${name}" ;; 1p) xo+=(--bitrate "${rc}") mx "${name}" ;; 2p) xo+=(--bitrate "${rc}" --pass) mx /dev/null 1 mx "${name}" 2 ;; 3p) xo+=(--bitrate "${rc}" --pass) mx /dev/null 1 mx /dev/null 3 mx "${name}" 3 ;; *) echo "Wrong usage" ;; esac echo "Encoding time:" } } 2>&1|tee "${log}" rm -v "${pipe}" "${multipasslog}"* |
ну и x264-enc.sh crf 16 исходник.avi
на самом деле, скрипт универсален.
как пример: x264-enc.sh 3p 1600 исходник.avi
Но все же лучше в crf
Если все же вэриэйбл, то ни в коем случае не в два прохода, а в три. тогда есть смысл в этом самом вэриэйбл.
ну и замеры делать надо, что бы точно прицелиться на нужный битрейт. есть msu под винду. msu hd платна.
можно и скрипт для сравнивания качества:
Код: |
#!/bin/bash # rrrrrr.sh
sources=("${@}")
time="$(date +%F_%H-%M-%S)" frames="${f:-2000}" compScreens="${s:-20}" dir="c${time}" mplayer="/usr/bin/mplayer"
framesInSource="$(echo "`$mplayer -frames 0 -msglevel identify=6:all=-1 -really-quiet -vo null -ao null ${sources[0]} 2>&1|grep -e ID_VIDEO_FPS= -e ID_LENGTH=|awk -F'=' '{print $2}'|tr '\n' '*'`1"|bc -ql|awk -F'.' '{print $1}')" if [ "${framesInSource}" -lt "${frames}" ] then echo "Video has only ${framesInSource} frames" frames="${framesInSource}" fi
every="$[${frames}/${compScreens}]"
n='1' screensl=( ) while [ "${n}" -lt "${frames}" ] do screensl+=("${n}") n="$[${n}+${every}]" done
echo -e "Will use frames:\n ${screensl[@]}"
screensl="$(for i in "${screensl[@]}"; do printf "%08g " "$i";done)" mkdir "${dir}" n='0' for v in "${sources[@]}" do time { video=(${v}) mkdir "${dir}/${n}" cd "${dir}/${n}" $mplayer -nosound -benchmark -lavdopts threads=1 -vf-clr -vo png:z=2 -noaspect -frames "${frames}" "${video[@]}" cd ../.. # compare every nth frame for s in ${screensl} do mv "${dir}/${n}/${s}.png" "${dir}/${s}_${n}.png" done
rm -r "${dir}/${n}" mogrify -verbose -quality 99 "${dir}/"*"_${n}.png" echo "done ${n}" } & n="$[${n}+1]" done |
rrrrrr.sh исходник.mkv конечный.файл.который.сравниваем.с.исходником.mkv
то есть, экспериментируем над маленьким кусочком видео.
можно еще шахматы сделать))):
Код: |
#!/bin/bash # x264-chess.sh
NumberOfParts="${1}" PartLength="${2}" mproptions=("${@:3}")
time="$(date +%F_%H-%M-%S)" tname="x264-test_${NumberOfParts}x${PartLength}f.mkv" pipe="${time}.y4m" mplayer="/usr/bin/mplayer" x264="/usr/bin/x264" mkvmerge="/usr/bin/mkvmerge"
SourceLength="$( $mplayer -frames 0 -msglevel identify=6:all=-1 -really-quiet -vo null -ao null "${mproptions[@]}"\ |grep ID_LENGTH=|sed 's/.*=\(.*\)\..*/\1/' )" every="$[${SourceLength}/${NumberOfParts}]"
echo -e "\nLossless encoding ${NumberOfParts} parts with ${PartLength} frames taken through every ${every} seconds from video with duration ${SourceLength} seconds, sample will have $[${PartLength}*${NumberOfParts}] frames:\n"
mx() { rm -vf "${pipe}" mkfifo "${pipe}"||exit 1 $mplayer -fixed-vo -quiet -nosound -nosub -benchmark -lavdopts threads=1 -vo yuv4mpeg:file="${pipe}" -vf-clr "${@:2}" & $x264 --crf 0 --threads auto "${pipe}" -o "${1}" }
if [ -f "${tname}" ] then echo -e "\nYou already have sample, delete it if you want new:\nrm ${tname}\n" else n='0' TestVideo=( ) time { while [ "${n}" -lt "${NumberOfParts}" ] do mx "${n}${tname}" -frames "${PartLength}" -ss "$[${n}*${every}]" "${mproptions[@]}" TestVideo+=("${n}${tname}") n="$[${n}+1]" done mx "a_${tname}" "${TestVideo[@]}" # you can play with 'mplayer -idx' without remuxing $mkvmerge -o "${tname}" "a_${tname}" } echo "Sizes:" du -s "${TestVideo[@]}" "a_${tname}" "${tname}" rm -v "${TestVideo[@]}" "a_${tname}" "${pipe}" fi |
x264-chess.sh 20 100 исходник.avi
(льем в один контейнер 20 кусков по 100 кадров потока)
под виндой можно и через megui. там всё есть.
Под маком есть X-code - замечательная вещь. всё можно собрать. и x264 и mencoder etc. больше, чем этот самый megui.
тот же imgmagick, который под цигвином не то. а msu hd (ssim замеры) платен и в этих самых варезах вы не найдете бесплатный вариант.