INTMU.Lab10
Nome:___________________________________ Nº___________ Data:__________
0.1
Instale o pacote FFmpeg.
Em Fedora Linux, esta instalação pode ser efetuada através do script inst_ffmpeg.sh disponibilizado.
0.2
Importe o arquivo de imagens disponibilizado em http://ave.dee.isep.ipp.pt/~jml/intmu/lab10/ wget http://ave.dee.isep.ipp.pt/~jml/intmu/lab10/frames_jpeg.tar Alternativamente, em situações de espaço de armazenamento reduzido é possível efetuar o trabalho com o arquivo frame_jpeg_small.tar que contém um subconjunto das imagens do arquivo original.
1.
Extraia as imagens para um directório jpeg: tar xvf frames_jpeg.tar ls jpeg/
Utilizando o utilitário ffplay, verifique que a apresentação sequencial destas imagens produz uma animação:
ffplay jpeg/frame%05d.jpeg
2.
Crie um novo directório com versões não comprimidas (ppm) das imagens. mogrify -format ppm jpeg/*.jpeg
mkdir ppm
mv jpeg/*.ppm ppm/
Verifique que a apresentação sequencial destas imagens continua a produzir uma animação. Avalie e registe o espaço em disco necessário para o armazenamento das imagens em ambos os formatos.
du -c -h jpeg du -c -h ppm
Determine a taxa de compressão atingida no formato JPEG.
PPM JPEG
Nº de imagens (NI) Espaço em disco (M)
3.
Verifique que a duração do filme está relacionada com a taxa de apresentação de imagens utilizada. Cronometre a duração de presentação para as taxas de apresentação de 15, 29.97 e 60 imagens por segundo:
time ffplay -framerate FR -autoexit jpeg/frame%05d.jpeg
Framerate (FR) [Hz] Duração (T) [s] NI/FR [s] Bitrate (B) [bps] 5 15 29.97 60 Verifique que T = NI/FR.
Determine e registe o bitrate (B=M/T) utilizado em cada reprodução. Verifique que o bitrate é proporcional ao framerate: B = FR * M/NI.
Nos exercícios seguinte utilize para duração nominal a obtida com FR=29.97 Hz, correspondente à taxa de amostragem temporal original.
4.
Crie um directório hjpeg com cópias das imagens originais. cp -r jpeg hjpeg
Reduza a taxa de mostragem espacial de cada uma destas novas imagens para 50%x50%. mogrify -resize 50% hjpeg/*.jpeg
ffplay -framerate 29.97 hjpeg/frame%05d.jpeg
Crie também um directório qjpeg com cópias das imagens originais escaladas para 25%x25% cp -r jpeg qjpeg
mogrify -resize 25% qjpeg/*.jpeg
ffplay -framerate 29.97 qjpeg/frame%05d.jpeg
Avalie e registe o espaço em disco (M) necessário para o armazenamento destas imagens, as taxas de compressão obtidas e o bitrate (B) exigido.
hjpeg (50%) qjpeg (25%)
Número de pixels (NCxNL) Espaço em disco (M) Taxa de compressão (C) Bitrate (B)
5.
Utilizando o utilitário composite do ImageMagick, crie a imagem dif9010.ppm, correspondente à diferença entre a imagem frame00090.ppm e a imagem frame00010.ppm.
cd ppm
convert frame00090.ppm frame00010.ppm -fx “(u-v+1)/2” dif9010.ppm display dif9010.ppm
Crie a imagem p00090.ppm como sendo a soma de dif9010.ppm com a imagem frame00010.ppm. convert frame00010.ppm dif9010.ppm -fx “(u+v+v-1)” p00090.ppm Compare a imagem resultante com a imagem frame00090.ppm.
display frame00090.ppm & display p00090.ppm &
compare frame00090.ppm p00090.ppm erro.ppm display erro.ppm
cd ..
6.
Crie um directório jpeg_gop com cópias das imagens originais reduzidas no directório qjpeg. cp -r qjpeg jpeg_gop
Prepare um script sub.sh para criar representações alternativas das imagens de número par, através da diferença para a imagem anterior.
diff_n.jpeg = frame_n.jpeg - frame_(n-1).jpeg n = 2, 4, 6, … #!/bin/bash
for i in {1..900..2}; do
printf -v fra “frame%05d.jpeg” $i
printf -v next “frame%05d.jpeg” $((i+1)) printf -v diff “diff%05d.jpeg” $((i+1)) echo “$next - $fra -> $diff”
... done
Aplique o seu script às imagens do directório jpeg_gop cd jpeg_gop
sh ../sub.sh cd ..
Elimine as imagens de número par.
Avalie e registe o espaço em disco necessário para o armazenamento deste conjunto de imagens e a taxa de compressão obtida.
du -c -h jpeg_gop jpeg_gop Nº de imagens Número de pixels (NCxNL) Espaço em disco (M) Taxa de compressão (C) Bitrate (B)
Prepare um script add.sh para recuperar as imagens pares a partir das diferenças calculadas e das imagens ímpares de referência.
frame_n.jpeg = frame_(n-1).jpeg + diff_n.jpeg n = 2, 4, 6, …
Aplique o script add.sh e verifique que recuperou um conjunto utilizável de imagens semelhante ao original.
ffplay jpeg_gop/frame%05d.jpeg
7.
Utilize o utilitário ffmpeg para criar um arquivo MPEG a partir das imagens originais. ffmpeg -i jpeg/frame%05d.jpeg comb1.mpeg
Nesta compressão, para além das técnicas de transformada DCT e da codificação das diferenças, foi também utilizada a técnica de codificação por vetores de movimento (motion vectors). Pode visualizar estes vetores com a opção +export_mvs do ffplay :
ffplay -flags2 +export_mvs comb1.mpeg -vf codecview=mv=pf+bf+bb Durante a visualização, pode utilizar a barra de espaços para parar (pause) a apresentação.
8.
Utilize o utilitário ffmpeg para criar arquivos MPEG com qualidade diversa, a partir das imagens originais.
ffmpeg -r 29.97 -i ppm/frame%05d.ppm comb2.mpeg Pode especificar directamente o bitrate pretendido, através da opção -b do ffmpeg.
ffmpeg -r 29.97 -i ppm/frame%05d.ppm -b 100k comb3.mpeg ffmpeg -r 29.97 -i ppm/frame%05d.ppm -b 8000k comb4.mpeg
Verifique que taxa de compressão é fortemente afetada pela variação da dimensão do GoP (Group of Pictures)
ffmpeg -r 29.97 -i ppm/frame%05d.ppm -g 3 comb5.mpeg ffmpeg -r 29.97 -i ppm/frame%05d.ppm -g 15 comb6.mpeg Experimente também variar a norma de codificação utilizada.
ffmpeg -r 29.97 -i ppm/frame%05d.ppm -qscale 0 -vcodec mpeg4 comb8.mpeg Registe a dimensão (M) dos arquivos obtidos, a taxa de compressão respetiva (C) e o bitrate exigido na tabela seguinte.
Arquivo Dimensão (M) Bitrate (B) Taxa de compressão (C) Duração (T) M/T
comb1.mpeg comb2.mpeg comb3.mpeg comb4.mpeg comb5.mpeg comb6.mpeg comb7.mpeg comb8.mpeg Verifique que B M/T
9.
Utilize o utilitário ffmpeg para criar arquivos MPEG com framerates diversos,
ffmpeg -r 29.97 -i ppm/frame%05d.ppm comb11.mpeg ffmpeg -r 50 -i ppm/frame%05d.ppm comb12.mpeg ffmpeg -r 29.97 -i ppm/frame%05d.ppm -r 25 comb13.mpeg ffmpeg -r 29.97 -i ppm/frame%05d.ppm -r 20 comb14.mpeg ffmpeg -r 25 -i ppm/frame%05d.ppm -r 50 comb15.mpeg ffmpeg -r 50 -i ppm/frame%05d.ppm -r 25 comb16.mpeg
Registe na tabela seguinte a dimensão dos arquivos obtidos, a duração e o número de frames (NI).
Arquivo Dimensão (M) Duração (T) Frames (NI) Framerate (FR) comb11.mpeg comb12.mpeg comb13.mpeg comb14.mpeg comb15.mpeg comb16.mpeg
10.
Utilize o utilitário ffmpeg para extrair secções do arquivo MPEG: ffmpeg -i comb1.mpeg -ss 2 -t 1 comb21.mpeg ffmpeg -i comb1.mpeg -ss 1 -t 2 comb12.mpeg ffplay comb21.mpeg
ffplay comb12.mpeg
Verifique que os arquivos MPEG podem ser concatenados diretamente: cat comb21.mpeg comb12.mpeg >comb2112.mpeg ffplay comb2112.mpeg
11.
Utilize o utilitário ffmpeg para extrair frames de um arquivo MPEG:
ffmpeg -i comb3.mpeg -ss 1 -vframes 10 test%04d.jpeg ls test*.jpeg
display test0001.jpeg
12.
Para entregar este trabalho, submeta este documento preenchido através da atividade Lab10 dá área de INTMU do Moodle.