🙂by Dave™


Přehrávač vektorového videa

O co se vlastně jedná? Vektorový přehrávač má od toho normálního jednu velikou výhodu. Běžné přehrávače přehrávají videa rastrově, zatímco tenhle vektorově. Jedná se o veliký rozdíl ve kvalitě videa! Výsledné video lze sledovat v mnohem větším rozlišení a menšími peměťovími nároky. Teď jsem dokončil prototyp a ne něm objevil několik much. Každopádně tohle je jen prototyp. Veškeré mouchy odstraním v další verzi, která se bude označovat 2.0. Ale teď k popisu tohoto prototypu. Celkově prototyp funguje následovně. Soubor videa je binární soubor v Javě (soubor videa je .Vvid). Vzhled třídy pro binární soubor je:


package net.byDave.VectorVideoPlayer;

import java.io.Serializable;

public class VideoData implements Serializable{
    public byte[] preview;

    public byte[][] images; //all images data
    public String[] imageType; //image type (.svg)
    public byte[] sounds; //sound data
    public String soundType; // .mp3, .wav, etc.
    public int[] times; //time between frames
    public int[] frames; //position of images
}

Výsledný soubor se potom rozbalí do mezipaměti a vytvoří se .html soubor, který se zobrazí ve webview. Komunikace s webview je zkrze Javascript k webview a k aplikaci zkrze Javu. Výsledek mé práce na přehrávači pro Android si můžete stáhnout.

Převod rastrového videa do vektorového

Nejdříve je zapořebí rozbalit video na samotné snímky. Pokud to už máte hotové, tak rozjeďte následující zdrojový kód v C++ (musíte nahradit všude v kódu klíčové slovo video-name názvem snímků videa). Pro správné fungování je zapotřebí mít stažený Linux a na něm přes terminál nainstalovaný Autotrace! Pak jen zkompilujte a spusťte a zadejte při spouštění za výstup kompilátoru množství snímků.


#include<cstdlib>
#include<sstream>
#include<iostream>
#include<iomanip>

using namespace std;

int main(int argc, char* argv[]){
	//starting
	int sum = atol(argv[1]);
	//cout << "sum is: " << sum;

	//info about starting
	system("echo 'Action started!'");

	//variables
	int i = 0;
	//stringstream ss;
	//cout << "ss is: " << ss.str();

	//while loop
	while(i < sum){
		//int i work
		i++;
		stringstream ss;
		ss /*<< setfill('0') << setw(5)*/ << i;

		//actual frame info
		string posinfo = "echo " + ss.str();
		system(&ss.str()[0u]);

		//convert to png
		//string inTerm; inTerm = "convert video-name" + ss.str() + ".jpg" + " video-name" + ss.str() + ".png";
		//system(&inTerm[0u]);

		//convert to svg
		string convert; convert = "autotrace -output-file output" + ss.str() + ".svg -output-format svg --color-count 32 video-name" + ss.str() + ".jpg";
		system(&convert[0u]);

	}//end of loop

	//end program
	system("echo 'Ended!'");
	return 0;
}

Dále si všechny tyhle převedené soubory dejte do složky Vvid-Frames. Dále tu máme zdrojový kód v Javě na vytvoření .Vvid z těchto snímků. Tohle si můžete stáhnout jako .jar soubor.


package net.byDave.VectorVideoPlayer;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;

public class main {
	public static void main(String[] args) throws IOException{
		System.out.println("Hello world!");
		ArrayList result = new ArrayList(); //ArrayList cause you don't know how many files there is
        File folder = new File("Vvid-Frames"); //This is just to cast to a File type since you pass it as a String
        File[] filesInFolder = folder.listFiles((File pathname) -> pathname.getName().endsWith(".svg")); // This returns all the folders and files in your path
        for (File file : filesInFolder) { //For each of the entries do:
            if (!file.isDirectory()) { //check that it's not a dir
                result.add(new String(file.getName())); //push the filename as a string
            }
        }
        //System.out.print(result);
        
        //adds images
        VideoData data = new VideoData();
        data.images = new byte[0][0];
        for(int i = 0; i < result.size(); i++){
        	data.images = Arrays.copyOf(data.images, data.images.length+1);
        	data.images[i] = Files.readAllBytes(filesInFolder[i].toPath());
        }
        
        //adds image types
        data.imageType = new String[0];
        for(int i = 0; i < data.images.length; i++){
        	data.imageType = Arrays.copyOf(data.imageType, data.imageType.length+1);
        	data.imageType[i] = ".svg";
        }
        
        //adds sounds
        data.sounds = Files.readAllBytes(Paths.get("Vvid-Frames/sounds.mp3"));
        data.soundType = ".mp3";
        
        //gets framerate
        System.out.print("What's the time between frames? ");
        String framerate = System.console().readLine();
        System.out.print("Selected framerate is: "); System.out.print(framerate); System.out.println("");
        
        //adds framerate
        data.times = new int[0];
        for(int i = 0; i < data.imageType.length; i++){
        	data.times = Arrays.copyOf(data.times, data.times.length+1);
        	data.times[i] = Integer.parseInt(framerate);
        }
        
        //adds order
        data.frames = new int[0];
        for(int i = 0; i < data.times.length; i++){
        	data.frames = Arrays.copyOf(data.frames, data.frames.length+1);
        	data.frames[i] = i;
        }
        
        FileOutputStream fos = new FileOutputStream("out.Vvid");
        ObjectOutputStream os = new ObjectOutputStream(fos);
        os.writeObject(data);
        os.close();
        
        System.out.println(data.images.length);
        System.out.println(data.images[0].length);
        System.out.println(data.images[1].length);
        System.out.println(data.imageType[1]);
        //byte[] btArr = Files.readAllBytes(Paths.get("Vvid-Frames/test.svg"));
        //System.out.println(btArr[1]);
	}
}

Mouchy prototypu

Soubor se musí rozbalit do mezipaměti v nekomprimované podobě a v této podobě to má neskutečnou velikost a všechno tohle bude zároveň i v RAM paměti (něco okolo 20GB pro 10 min. video).

Verze 2.0

Kvůli mouchám se od vývoje prototypu upustilo, ale ve verzi 2.0 bude vše opraveno. Verze 2.0 neoznačuje verzi prototypu, ale samotného projektu. Verze 2.0 bude udělaná naprosto jinačím způsobem a nebude mít s tímto prototypem nic společného.

Neudělané věci

Podpora pro kompresi (.zVvid)

Možnost přetáčení videa

Ukazatel, kde jste teď ve videu

Soubory ke stažení

Zdrojový kód přehrávačeJAR na generování

Autorská práva ke zdrojovým kódům na stránce a stáhnutelnému obsahu

Copyright © 2017, David Husička. Všechna práva vyhrazena.

Redistribuce a použití zdrojových i binárních forem díla, v původním i upravovaném tvaru, jsou povoleny za následujících podmínek:

  • Šířený zdrojový kód musí obsahovat výše uvedenou informaci o copyrightu, tento seznam podmínek a níže uvedené zřeknutí se odpovědnosti.
  • Šířený binární tvar musí nést výše uvedenou informaci o copyrightu, tento seznam podmínek a níže uvedené zřeknutí se odpovědnosti ve své dokumentaci a/nebo dalších poskytovaných materiálech.
  • Ani jméno vlastníka práv, ani jména přispěvatelů nemohou být použita při podpoře nebo právních aktech souvisejících s produkty odvozenými z tohoto softwaru bez výslovného písemného povolení.
TENTO SOFTWARE JE POSKYTOVÁN DRŽITELEM LICENCE A JEHO PŘISPĚVATELI „JAK STOJÍ A LEŽÍ“ A JAKÉKOLIV VÝSLOVNÉ NEBO PŘEDPOKLÁDANÉ ZÁRUKY VČETNĚ, ALE NEJEN, PŘEDPOKLÁDANÝCH OBCHODNÍCH ZÁRUK A ZÁRUKY VHODNOSTI PRO JAKÝKOLIV ÚČEL JSOU POPŘENY. DRŽITEL, ANI PŘISPĚVATELÉ NEBUDOU V ŽÁDNÉM PŘÍPADĚ ODPOVĚDNI ZA JAKÉKOLIV PŘÍMÉ, NEPŘÍMÉ, NÁHODNÉ, ZVLÁŠTNÍ, PŘÍKLADNÉ NEBO VYPLÝVAJÍCÍ ŠKODY (VČETNĚ, ALE NEJEN, ŠKOD VZNIKLÝCH NARUŠENÍM DODÁVEK ZBOŽÍ NEBO SLUŽEB; ZTRÁTOU POUŽITELNOSTI, DAT NEBO ZISKŮ; NEBO PŘERUŠENÍM OBCHODNÍ ČINNOSTI) JAKKOLIV ZPŮSOBENÉ NA ZÁKLADĚ JAKÉKOLIV TEORIE O ZODPOVĚDNOSTI, AŤ UŽ PLYNOUCÍ Z JINÉHO SMLUVNÍHO VZTAHU, URČITÉ ZODPOVĚDNOSTI NEBO PŘEČINU (VČETNĚ NEDBALOSTI) NA JAKÉMKOLIV ZPŮSOBU POUŽITÍ TOHOTO SOFTWARE, I V PŘÍPADĚ, ŽE DRŽITEL PRÁV BYL UPOZORNĚN NA MOŽNOST TAKOVÝCH ŠKOD.
(Zdroj textu licence)