Здравстяуйте!
Когда-то я я написал скрипт для перекодирования mkv-файлов для уменьшения их размера, потом разбил его на два. 1-й декодирует исходный mkv и создаёт файл yuv4pegpipe.y4m, 2-й кодирует его в более сжатый mkv. Когда у меня был процессор AMF FX-8350, потом Ryzen 5 B3600 и для кодирования использовалась утилита x264, всё получалось, а когда я установил процессор AMD Ryzen 5 7500F и стал кодировать утилитой x265, то результат стал иметь fps=25, хотя у исходнго файла было 24, Для декодирования используется ffmpeg, я пробовал разные vsync (fps_mode), но это не помогло. Вот скрипт для декодирования, там главное - вызов ffmpeg.[spoiler=decoding]#!/bin/bash
[spoiler=decoding]#!/bin/bash
fout="/home/peter-irich/encode_y4m_from_mkv.out"
/bin/date > $fout
declare -a nam_arr
cntf=0
while read flnm ; do
nam_arr[$cntf]=$flnm
echo $cntf ${nam_arr[$cntf]}
echo $cntf ${nam_arr[$cntf]} >> $fout
let cntf++
done < /home/peter-irich/mkv.lst
dirs="/media/peter-irich/Seagate_4TB/nobody/mkv_files"
cnti=0
cd $dirs
while [ $cnti -lt $cntf ] ; do
namf=${nam_arr[$cnti]}
namm=`echo $namf | /usr/bin/cut -d "." -f 1`
/bin/date > $namm.time
echo "namm="$namm >> $namm.time
echo "namm="$namm >> $fout
/bin/date > $namm.time
/bin/date >> $fout
/usr/bin/mediainfo $dirs/$namm.mkv > $namm.info
# /usr/bin/mediainfo $dirs/$namm.mkv >> $fout
naud=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep -c ^Audio`
nw1=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep Width | \
/usr/bin/tr -s " " | /usr/bin/cut -d " " -f 3`
nw2=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep Width | \
/usr/bin/tr -s " " | /usr/bin/cut -d " " -f 4`
if [ "$nw2" = "pixels" ] ; then
nw=$nw1
else
let nw2=10#${nw2}
let nw=1000*nw1+nw2
fi
nh1=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep Height | \
/usr/bin/tr -s " " | /usr/bin/cut -d " " -f 3`
nh2=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep Height | \
/usr/bin/tr -s " " | /usr/bin/cut -d " " -f 4`
echo $nw1 $nw2 $nw "nh1="$nh1 "nh2="$nh2 $nh
echo $nw1 $nw2 $nw "nh1="$nh1 "nh2="$nh2 $nh >> $fout
if [ "$nh2" = "pixels" ] ; then
nh=$nh1
else
let nh2=10#${nh2}
let nh=1000*nh1+nh2
fi
#echo $nw1 $nw2 $nw $nh1 $nh2 $nh
echo $namm.mkv "naud="$naud $nw $nh
echo $namm.mkv "naud="$naud $nw $nh >> $fout
#/usr/bin/ffmpeg -i $dirs/$namm.mkv -an -sn -map 0 -vsync 2 \
#-fps_mode vfr
#/usr/bin/ffmpeg -i $dirs/$namm.mkv -an -sn -map 0 -vsync 1 \
#-strict strict -f yuv4mpegpipe ${namm}.y4m > ${namm}_y4m.err 2>&1
/usr/bin/ffmpeg -i $dirs/$namm.mkv -an -sn -map 0 -fps_mode cfr \
-f yuv4mpegpipe ${namm}.y4m > ${namm}_y4m.err 2>&1
echo $namm "y4m was build"
echo $namm "y4m was build" >> $namm.time
echo $namm "y4m was build" >> $fout
/bin/date >> $namm.time
/bin/date >> $fout
let cnti++
done
#cd /home/peter-irich
#/usr/bin/sync
#/usr/bin/umount /media/peter-irich/Seagate_4TB
#/usr/bin/udisksctl power-off -b /dev/sdb
##/usr/bin/umount /media/peter/Seagate_5TB
##/usr/bin/udisksctl power-off -b /dev/sdc
#/usr/bin/sudo /usr/sbin/shutdown -P +0
[/spoiler]
Вот скрипт для кодирования, в нем главное - вызов x265.
[spoiler=coding]#!/bin/bash
fout="/home/peter-irich/encode_mkv_from_y4m.out"
/bin/date > $fout
declare -a nam_arr
cntf=0
while read flnm ; do
nam_arr[$cntf]=$flnm
echo $cntf ${nam_arr[$cntf]}
echo $cntf ${nam_arr[$cntf]} >> $fout
let cntf++
done < /home/peter-irich/mkv.lst
dirs="/media/peter-irich/Seagate_4TB/nobody/mkv_files"
cnti=0
cd $dirs
while [ $cnti -lt $cntf ] ; do
namf=${nam_arr[$cnti]}
namm=`echo $namf | /usr/bin/cut -d "." -f 1`
/bin/date > $namm.time
echo "namm="$namm > $namm.time
echo "namm="$namm >> $fout
/bin/date > $namm.time
/bin/date >> $fout
/usr/bin/mediainfo $dirs/$namm.mkv > $namm.info
/usr/bin/mediainfo $dirs/$namm.mkv >> $fout
naud=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep -c ^Audio`
nw1=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep Width | \
/usr/bin/tr -s " " | /usr/bin/cut -d " " -f 3`
nw2=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep Width | \
/usr/bin/tr -s " " | /usr/bin/cut -d " " -f 4`
if [ "$nw2" = "pixels" ] ; then
nw=$nw1
else
let nw2=10#${nw2}
let nw=1000*nw1+nw2
fi
nh1=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep Height | \
/usr/bin/tr -s " " | /usr/bin/cut -d " " -f 3`
nh2=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep Height | \
/usr/bin/tr -s " " | /usr/bin/cut -d " " -f 4`
echo $nw1 $nw2 $nw "nh1="$nh1 "nh2="$nh2 $nh
echo $nw1 $nw2 $nw "nh1="$nh1 "nh2="$nh2 $nh >> $fout
if [ "$nh2" = "pixels" ] ; then
nh=$nh1
else
let nh2=10#${nh2}
let nh=1000*nh1+nh2
fi
echo $nw1 $nw2 $nw $nh1 $nh2 $nh
echo $namm.mkv "naud="$naud $nw $nh
echo $namm.mkv "naud="$naud $nw $nh >> $fout
/usr/bin/x265 --log-level warning --input-res ${nw}x${nh} --fps 24.000 \
--preset veryslow --csv-log-level 2 --csv ${namm}.log \
-o ${namm}_cmpr_v.mkv ${namm}.y4m > ${namm}_cmpr_v.err 2>& 1
/bin/ls -l ${namm}.y4m >> $namm.time
# /bin/rm -f ${namm}.y4m
echo $namm "cmpr_v.mkv was build"
echo $namm "cmpr_v.mkv was build" >> $fout
echo "$namm cmpr_v.mkv was build" >> $namm.time
/bin/date >> $namm.time
/bin/date >> $fout
cnt=0
while [ $cnt -lt $naud ] ; do
prf=""
if [ $cnt -lt 10 ] ; then
prf="0"
fi
nmb=${prf}$cnt
echo $nmb
echo $nmb >> $fout
echo $nmb >> $namm.time
/usr/bin/ffmpeg -i $dirs/$namm.mkv -map 0:a:$cnt -c:a ac3 \
${namm}_$nmb.ac3 > ${namm}_$nmb.err 2>&1
/usr/bin/mkvmerge -o ${namm}_$nmb.mka ${namm}_$nmb.ac3
let cnt++
/bin/date >> $namm.time
/bin/date >> $fout
done
echo "mkv_end" >> $namm.time
echo "mkv_end" >> $fout
let cnti++
done
cd /home/peter-irich
/usr/bin/sync
/usr/bin/umount /media/peter-irich/Seagate_4TB
/usr/bin/udisksctl power-off -b /dev/sdb
/usr/bin/sudo /usr/sbin/shutdown -h +0
[/spoiler]
Я не нашёл, как добиться от x265, чтобы она кодировала с частотой исходного файла, хотя смотрел и в Интернете.
М.б., тут есть знатоки этого процесса и подскажут, в чём причина и что делать?
Когда-то я я написал скрипт для перекодирования mkv-файлов для уменьшения их размера, потом разбил его на два. 1-й декодирует исходный mkv и создаёт файл yuv4pegpipe.y4m, 2-й кодирует его в более сжатый mkv. Когда у меня был процессор AMF FX-8350, потом Ryzen 5 B3600 и для кодирования использовалась утилита x264, всё получалось, а когда я установил процессор AMD Ryzen 5 7500F и стал кодировать утилитой x265, то результат стал иметь fps=25, хотя у исходнго файла было 24, Для декодирования используется ffmpeg, я пробовал разные vsync (fps_mode), но это не помогло. Вот скрипт для декодирования, там главное - вызов ffmpeg.[spoiler=decoding]#!/bin/bash
[spoiler=decoding]#!/bin/bash
fout="/home/peter-irich/encode_y4m_from_mkv.out"
/bin/date > $fout
declare -a nam_arr
cntf=0
while read flnm ; do
nam_arr[$cntf]=$flnm
echo $cntf ${nam_arr[$cntf]}
echo $cntf ${nam_arr[$cntf]} >> $fout
let cntf++
done < /home/peter-irich/mkv.lst
dirs="/media/peter-irich/Seagate_4TB/nobody/mkv_files"
cnti=0
cd $dirs
while [ $cnti -lt $cntf ] ; do
namf=${nam_arr[$cnti]}
namm=`echo $namf | /usr/bin/cut -d "." -f 1`
/bin/date > $namm.time
echo "namm="$namm >> $namm.time
echo "namm="$namm >> $fout
/bin/date > $namm.time
/bin/date >> $fout
/usr/bin/mediainfo $dirs/$namm.mkv > $namm.info
# /usr/bin/mediainfo $dirs/$namm.mkv >> $fout
naud=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep -c ^Audio`
nw1=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep Width | \
/usr/bin/tr -s " " | /usr/bin/cut -d " " -f 3`
nw2=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep Width | \
/usr/bin/tr -s " " | /usr/bin/cut -d " " -f 4`
if [ "$nw2" = "pixels" ] ; then
nw=$nw1
else
let nw2=10#${nw2}
let nw=1000*nw1+nw2
fi
nh1=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep Height | \
/usr/bin/tr -s " " | /usr/bin/cut -d " " -f 3`
nh2=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep Height | \
/usr/bin/tr -s " " | /usr/bin/cut -d " " -f 4`
echo $nw1 $nw2 $nw "nh1="$nh1 "nh2="$nh2 $nh
echo $nw1 $nw2 $nw "nh1="$nh1 "nh2="$nh2 $nh >> $fout
if [ "$nh2" = "pixels" ] ; then
nh=$nh1
else
let nh2=10#${nh2}
let nh=1000*nh1+nh2
fi
#echo $nw1 $nw2 $nw $nh1 $nh2 $nh
echo $namm.mkv "naud="$naud $nw $nh
echo $namm.mkv "naud="$naud $nw $nh >> $fout
#/usr/bin/ffmpeg -i $dirs/$namm.mkv -an -sn -map 0 -vsync 2 \
#-fps_mode vfr
#/usr/bin/ffmpeg -i $dirs/$namm.mkv -an -sn -map 0 -vsync 1 \
#-strict strict -f yuv4mpegpipe ${namm}.y4m > ${namm}_y4m.err 2>&1
/usr/bin/ffmpeg -i $dirs/$namm.mkv -an -sn -map 0 -fps_mode cfr \
-f yuv4mpegpipe ${namm}.y4m > ${namm}_y4m.err 2>&1
echo $namm "y4m was build"
echo $namm "y4m was build" >> $namm.time
echo $namm "y4m was build" >> $fout
/bin/date >> $namm.time
/bin/date >> $fout
let cnti++
done
#cd /home/peter-irich
#/usr/bin/sync
#/usr/bin/umount /media/peter-irich/Seagate_4TB
#/usr/bin/udisksctl power-off -b /dev/sdb
##/usr/bin/umount /media/peter/Seagate_5TB
##/usr/bin/udisksctl power-off -b /dev/sdc
#/usr/bin/sudo /usr/sbin/shutdown -P +0
[/spoiler]
Вот скрипт для кодирования, в нем главное - вызов x265.
[spoiler=coding]#!/bin/bash
fout="/home/peter-irich/encode_mkv_from_y4m.out"
/bin/date > $fout
declare -a nam_arr
cntf=0
while read flnm ; do
nam_arr[$cntf]=$flnm
echo $cntf ${nam_arr[$cntf]}
echo $cntf ${nam_arr[$cntf]} >> $fout
let cntf++
done < /home/peter-irich/mkv.lst
dirs="/media/peter-irich/Seagate_4TB/nobody/mkv_files"
cnti=0
cd $dirs
while [ $cnti -lt $cntf ] ; do
namf=${nam_arr[$cnti]}
namm=`echo $namf | /usr/bin/cut -d "." -f 1`
/bin/date > $namm.time
echo "namm="$namm > $namm.time
echo "namm="$namm >> $fout
/bin/date > $namm.time
/bin/date >> $fout
/usr/bin/mediainfo $dirs/$namm.mkv > $namm.info
/usr/bin/mediainfo $dirs/$namm.mkv >> $fout
naud=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep -c ^Audio`
nw1=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep Width | \
/usr/bin/tr -s " " | /usr/bin/cut -d " " -f 3`
nw2=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep Width | \
/usr/bin/tr -s " " | /usr/bin/cut -d " " -f 4`
if [ "$nw2" = "pixels" ] ; then
nw=$nw1
else
let nw2=10#${nw2}
let nw=1000*nw1+nw2
fi
nh1=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep Height | \
/usr/bin/tr -s " " | /usr/bin/cut -d " " -f 3`
nh2=`/usr/bin/mediainfo $dirs/$namm.mkv | /bin/grep Height | \
/usr/bin/tr -s " " | /usr/bin/cut -d " " -f 4`
echo $nw1 $nw2 $nw "nh1="$nh1 "nh2="$nh2 $nh
echo $nw1 $nw2 $nw "nh1="$nh1 "nh2="$nh2 $nh >> $fout
if [ "$nh2" = "pixels" ] ; then
nh=$nh1
else
let nh2=10#${nh2}
let nh=1000*nh1+nh2
fi
echo $nw1 $nw2 $nw $nh1 $nh2 $nh
echo $namm.mkv "naud="$naud $nw $nh
echo $namm.mkv "naud="$naud $nw $nh >> $fout
/usr/bin/x265 --log-level warning --input-res ${nw}x${nh} --fps 24.000 \
--preset veryslow --csv-log-level 2 --csv ${namm}.log \
-o ${namm}_cmpr_v.mkv ${namm}.y4m > ${namm}_cmpr_v.err 2>& 1
/bin/ls -l ${namm}.y4m >> $namm.time
# /bin/rm -f ${namm}.y4m
echo $namm "cmpr_v.mkv was build"
echo $namm "cmpr_v.mkv was build" >> $fout
echo "$namm cmpr_v.mkv was build" >> $namm.time
/bin/date >> $namm.time
/bin/date >> $fout
cnt=0
while [ $cnt -lt $naud ] ; do
prf=""
if [ $cnt -lt 10 ] ; then
prf="0"
fi
nmb=${prf}$cnt
echo $nmb
echo $nmb >> $fout
echo $nmb >> $namm.time
/usr/bin/ffmpeg -i $dirs/$namm.mkv -map 0:a:$cnt -c:a ac3 \
${namm}_$nmb.ac3 > ${namm}_$nmb.err 2>&1
/usr/bin/mkvmerge -o ${namm}_$nmb.mka ${namm}_$nmb.ac3
let cnt++
/bin/date >> $namm.time
/bin/date >> $fout
done
echo "mkv_end" >> $namm.time
echo "mkv_end" >> $fout
let cnti++
done
cd /home/peter-irich
/usr/bin/sync
/usr/bin/umount /media/peter-irich/Seagate_4TB
/usr/bin/udisksctl power-off -b /dev/sdb
/usr/bin/sudo /usr/sbin/shutdown -h +0
[/spoiler]
Я не нашёл, как добиться от x265, чтобы она кодировала с частотой исходного файла, хотя смотрел и в Интернете.
М.б., тут есть знатоки этого процесса и подскажут, в чём причина и что делать?