Sunteți pe pagina 1din 18

Universitatea Tehnică a Moldovei

LUCRARE DE AN

LA DISCIPLINA: TEHNICI ȘI MECANISME DE PROIECTARE SOFTWARE


CU TEMA: Proiectarea și implementarea unei aplicații mobile pentru descărcarea
clipului video de la o adresă URL cu ajutorul soluției FFMpeg

Student:
Guzun Ion, TI-171

Conducător:
asis. univ., magistru Scrob Sergiu

Chișinău – 2020
CUPRINS

INTRODUCERE..................................................................................................................................3
1. ANALIZA PROBLEMEI................................................................................................................ 4
1.1. Instrumentele pentru linia de comanda..........................................................................................4
1.2. Bibliotecile FFmpeg.......................................................................................................................4
1.3 Suportarea hardware........................................................................................................................5
1.4 Aspectul legal...................................................................................................................................6
1.5 Proiecte care utilizeaza FFmpeg......................................................................................................6
1.6 Codecuri si formate suportate..........................................................................................................7
2. PROIECTAREA SISTEMULUI...................................................................................................... 8
2.1. Compilarea FFmpeg.......................................................................................................................8
2.2. Adaugarea in proiect.......................................................................................................................9
3. UTILIZAREA FFMPEG ..................................................................................................................10
2.1. Incarcarea binarului...................................................................................................................10
2.2. Executarea binarului................................................................................................................11
2.3. Metodele valabile ....................................................................................................................12
CONCLUZII ŞI RECOMANDĂRI .................................................................................................... 13
BIBLIOGRAFIE .................................................................................................................................. 14
ANEXE .................................................................................................................................
INTRODUCERE
FFmpeg este un proiect gratuit și open-source, format dintr-un set larg de
biblioteci software și programe pentru gestionarea fișierelor video, audio și a
altor fișiere și fluxuri multimedia. La baza sa se află programul FFmpeg în
sine, proiectat pentru procesarea pe linia de comandă a fișierelor video și
audio și utilizat pe scară largă pentru transcodarea formatelor, editare de bază
(taiere și concatenare), scalare video, efecte post-producție video și
respectarea standardelor(SMPTE, ITU).
FFmpeg include libavcodec, o biblioteca de codec audio/video folosită de
multe produse software comerciale și gratuite, libavformat, o bibliotecă
audio/video container mux și demux și programul principal de linie de
comandă ffmpeg pentru transcodarea fișierelor multimedia.
FFmpeg face parte din fluxul de lucru al altor sute de proiecte software, iar
bibliotecile sale sunt o parte de bază a player-urilor media software, cum ar fi
VLC, și a fost inclus în procesarea de bază pentru YouTube și inventarul de
fișiere iTunes. Codec-uri pentru codificarea și/sau decodarea majorității
formatelor de fișiere audio și video cunoscute sunt incluse, ceea ce îl face
extrem de util pentru transcodificarea fișierelor media comune și neobișnuite
într-un singur format comun. Numele proiectului este inspirat de grupul de
standarde video MPEG, împreună cu „FF” pentru „înaintarea rapidă” sau “fast
forward” in engleza.
FFmpeg este un convertor video și audio foarte rapid, care poate lucra și cu o
sursă audio/video în direct. Se poate converti, de asemenea, între ratele de
eșantion arbitrar și redimensionarea videoclipurilor pe zbor cu un filtru
polifazic de înaltă calitate. FFmpeg citește dintr-un număr arbitrar de „fișiere”
de intrare (care pot fi fișiere obișnuite, conducte, fluxuri de rețea, dispozitive
de inregistrare, etc.), specificate de opțiunea -i, și scrie unui număr arbitrar de
„fișiere” de ieșire, care sunt specificate de un URL de ieșire simplu. Orice
lucru găsit pe linia de comandă care nu poate fi interpretat ca o opțiune este
considerat a fi un URL de ieșire.
Fiecare url de intrare sau de ieșire poate conține, în principiu, orice număr de
fluxuri de diferite tipuri (video/audio/subtitrare/atașament/date). Numărul
permis și/sau tipurile de fluxuri pot fi limitate în funcție de formatul
containerului. Selectarea fluxurilor de la care intrările vor intra în care ieșire,
se face automat sau cu opțiunea -map.
ANALIZA PROBLEMEI
Comenzile pentru linia de comanda
 ffmpeg – este un instrument pentru linia de comanda care convertește formate
audio sau video. De asemenea, poate captura și codifica în timp real din diverse
surse hardware și software, cum ar fi o placă de captare TV.
 ffplay – este un simplu media player care utilizeaza SDL si bibliotecile FFmpeg.
 ffprobe – este un instrument pentru linia de comanda care este utilizat pentru
afisarea informatiei media (text, CSV, XML JSON).

Bibliotecile FFmpeg
 libswresample este o biblioteca care conține rutine de eșantionare audio.
 libavresample – este o bibliotecă care conține rutine de eșantionare audio din
proiectul Libav, similar cu libswresample de la ffmpeg.
 libavcodec - este o bibliotecă care conține toate codificatoarele și decodatoarele
audio/video FFmpeg native. Majoritatea codec-urilor au fost dezvoltate de la zero
pentru a asigura cea mai buna performanța și reutilizarea efectiva codurilor.
 libavformat – este o biblioteca care contine muxere si demuxere pentru containerele
audio/video.
 libavutil - este o bibliotecă de ajutor care conține rutinele comune ale diferitelor
părți ale FFmpeg. Această bibliotecă include funcții hash (Adler-32, CRC, MD5,
RIPEMD, SHA-1, SHA-2, MurmurHash3, HMAC MD-5, HMAC SHA-1 și
HMAC SHA-2), codificatoarele (DES, RC4, AES, AES-CTR, TEA, XTEA,
Blowfish, CAST-128, Twofish și Camellia), decompresorul LZO și
codificator/decodificator de tip Base64.
 libpostproc – este o biblioteca ce contine rutinele de postprocesare video bazate pe
vechiul format H263.
 libswscale – este biblioteca ce contine scalarea imaginilor intr-un video si rutinele
de conversie a spatiului de culori sau formatului de pixeli.
 libavfilter - este înlocuitorul pentru vhook care permite modificarea sau
examinarea video/audio între decodare și codificare. Filtrele au fost portate din mai
multe proiecte, inclusiv MPlayer și avisynth.
Suportarea hardware
FFmpeg cuprinde implementări software de algoritmi de compresie și decompresie video și
audio. Acestea pot fi compilate și rulate pe diverse seturi de instrucțiuni.
Multe seturi de instrucțiuni răspândite sunt acceptate de FFmpeg, inclusiv x86 (IA-32 și
x86-64), PPC (PowerPC), ARM, DEC Alpha, SPARC și MIPS.
Există diferite circuite integrate specifice aplicației (ASIC) legate de compresia si
decompresia video și audio. Un astfel de ASIC poate efectua calculul pentru decompresie
audio/video sau compresie parțial sau complet pentru a le descărca de la procesorul gazdă.
Pentru a utiliza un astfel de ASIC, în loc de o implementare completă a unui algoritm, este
necesară numai API-ul. Există numeroase ASIC-uri și API-uri, dintre care mai multe sunt
suportate de FFmpeg.
Companie ASIC destinatie Suportat de Detalii
FFmpeg
AMD UVD decodare da Prin API-ul
VDPAU si VAAPI
AMD VCE codare da Prin VAAPI,
considerat
experimental
Amlogic Amlogic Video decodare necunoscut -
Engine
BlackMagic DeckLink codare/decodare da Redare si
inregistrare in timp
real
Broadcom Crystal HD decodare da -
Intel Intel Clear Video decodare da -
Intel Intel Quick Sync Decodare/codare da -
Video
Nvidia PureVideo/NVDE decodare da Prin API-ul
C VDPAU de la
versiunea FFmpeg
v1.2, sau prin
CUVID de la
versiunea FFPmeg
v3.1
Nvidia NVENC codare da De la versiunea
FFmpeg v2.6
Tabelul 1.1 - Suportarea FFmpeg de diferite procesoare
Aspectul legal
FFmpeg contine mai mult de 100 de codecuri, majoritatea flosind tehnici de comresie de
un fel sau altul. Multe tehnici de compresie pot fi supuse unor cereri legale referitor la
brevetele legale. Astfel de afirmatii pot fi aplicabile in tare precum Statele unite, care au
implementat brevetele sofware, dar sunt considerate neaplicabile sau nule in tarile membre
ale Uninunii Europene, de exemplu codecurile MPEG-1 si MPEG-2 sunt expirate chiar si
AC3. FFmpeg este licentiat sub licenta LGPL, cu toate acestea, daca o constructie
particulara de FFmpeg este legata de orice biblioteca GPL, in special x264, atunci intregul
binar este licentiat in baza GPL.

Proiecte care utilizeaza FFmpeg


FFmpeg este utilizat de o gama larga de produse software cum ar fi media playerul VLC,
xine, Shotcut, editorul video Cinelerra-GG, Plex, Kodi, Blender, HandBrake, YouTube si
MPC-HC, el gestioneaza redarea video si audio in Google Chrome si in versiunea pentru
Linux de Firefox. Front-end-ul pentru interfata grafica de utilizator pentru FFmpeg a fost
dezvoltata, incluzand si XMedia Recode.
FFmpeg este utilizat de ffdshow, LAV Filters, GStreamer FFmpeg plug-in, Perian si
OpenMAX IL pentru a mari capabilitatea de decodare si codare a platformelor rexpective.

Codecurile si formatele suportate


FFmpeg suorta majoritatea formatelor comune si unele neobisnuite. Formatul de imagine
PGMYUV este o variantă homebrewn a formatului binar (P5) PGM Netpbm. FFmpeg
acceptă, de asemenea, adâncimi de 16 biți ale formatelor PGM și PPM, iar formatul PAM
binar (P7) cu sau fără canal alfa, adâncime de 8 biți sau 16 biți pentru pix_fmts monob, gri,
gri16be, rgb24, rgb48be, ya8, rgba, rgb64be.
Pe lângă formatele FFV1 și Snow, care au fost create și dezvoltate din cadrul FFmpeg,
proiectul acceptă și următoarele formate:
Grupa Tipul Numele formatului
formatul
ui
ISO/IEC/IT Video MPEG-1 Part 2, H.261 (Px64), H.262/MPEG-2 Part 2, H.263, MPEG-4 Part
U-T 2, H.264/MPEG-4 AVC, HEVC/H.265 (MPEG-H Part 2), Motion JPEG,
IEC DV video and CD+G
ISO/IEC/IT Audio MP1, MP2, MP3, AAC, HE-AAC, MPEG-4 ALS, G.711 μ-law, G.711 A-
U-T law, G.721 (a.k.a. G.726 32k), G.722, G.722.2 (a.k.a. AMR-WB), G.723
(a.k.a. G.726 24k and 40k), G.723.1, G.726, G.729, G.729D, IEC DV audio
and Direct Stream Transfer
ISO/IEC/IT Subtitrari MPEG-4 Timed Text (a.k.a. 3GPP Timed Text)
U-T

ISO/IEC/IT Imagini JPEG, Lossless JPEG, JPEG-LS, JPEG 2000, PNG, CCITT G3 and CCITT
U-T G4

Microsoft Video Microsoft RLE, Microsoft Video 1, Cinepak, Indeo (v2, v3 and v5),[37]
Microsoft MPEG-4 v1, v2 and v3, Windows Media Video (WMV1, WMV2,
WMV3/VC-1), WMV Screen and Mimic codec
Microsoft Audio Windows Media Audio (WMA1, WMA2, WMA Pro and WMA Lossless),
XMA (XMA1 and XMA2), MS-GSM and MS-ADPCM
Microsoft Subtitrari SAMI
Microsoft Imagini Windows Bitmap, WMV Image (WMV9 Image and WMV9 Image v2) and
DirectDraw Surface
On2/GIPS/ Video Duck TrueMotion 1, Duck TrueMotion 2, Duck TrueMotion 2.0 Real Time,
Google VP3, VP4, VP5,[37] VP6,[37] VP7, VP8, VP9[20] and animated WebP
On2/GIPS/ Audio DK ADPCM Audio 3/4, On2 AVC and iLBC (via libilbc)
Google

On2/GIPS/ Imagini WebP


Google

Apple Video Cinepak (Apple Compact Video), ProRes, Sorenson 3 Codec, QuickTime
Animation (Apple Animation), QuickTime Graphics (Apple Graphics),
Apple Video, Apple Intermediate Codec and Pixlet
Apple Audio ALAC
Tabelul 1.2 - Formate acceptate de FFmpeg
PROIECTAREA SISTEMULUI
Compilarea FFmpeg
Pentru a proiecta o aplicatie mobila pentru Android cu ajutorul solutiei FFmpeg, mai intai
este necesar pentru a compila biblioteca astfel ca ea sa fie suportata de arhitectura
procesoarelor arm care este utilizata in dispozitivele mobile.
Pentru aceasta este necesar in command-line sa executam urmatoarele instructiuni:
 Setam variabilele pentru mediul android:
export ANDROID_NDK={C:\Program Files\Android\Android
Studio\plugins\android-ndk\lib}
 Executam urmatoarea comanda pentru a compila ffmpeg
sudo apt-get –quiet –yes install build-essential git autoconf libtool pkg-config gperf
gettext yasm
./init_update_libs.sh
./android_build.sh
 Pentru a face update la librarii se foloseste comanda:
./init_update_libs.sh
 Se gaseste binariul executabil si se creaza directoriul.
 Pentru utilizarea FONTCONFIG este necesar de specificat fisierul.
Adaugarea in proiect
Pentru a utiliza bibliotecile FFmpeg compilate pentru android este necesar de a le adauga
in proiect, pentru aceasta exista trei metode:
 Descarcarea si copierea fisierului “FFmpegAndroid-0.3.2.aar” in directoriul
app/libs si adaugarea in fisierul app/build.gradle a codului:
repositories {
flatDir {
dir ‘libs’ } }
dependecies {
compile(name:’FFmpegAndroid’, ext:’aar’) }
 Sau preluarea prin gradle
compile ‘com.wirtingminds: FFmpegAndroid:0.3.2’
 Sau prin Maven
<dependency>
<groupId>com.writingminds</groupId>
<artifactId>FFmpegAndroid</artifactId>
<version>0.3.2</version>
</dependency>
Utilizarea FFPMEG
Incarcarea binarului
Incarcarea binarului ffmpeg este o metoda care copie fisierele binare pe dispozitiv luand in
considerare arhitectura procesorului pe care il are. Pentru aceasta este nevoie de introdus in
codul proiectului metoda “FFmpeg ffmpeg = FFmpeg.getInstance(context)” care odata ce a
fost introdusa va inarca fisierele binare pe dispozitiv dupa arhitectura sa, va verifica daca
suntem la ultima versiune de FFmpeg si daca va fi necesar aceasta va fi innoita si va da
raspunsuri prin interfata FFmpegLoadBinaryResponseHandler.

Figura 2.1 Incarcarea ffmpeg pe dispozitiv


Executarea binarului
Pentru executarea ffmpeg in proiectul android este necesar de a introduce comanda care se
doreste de a fi executata ca argument al metodei “execute”, aceasta metoda va executa
comenzile ffmpeg si va returna raspuns prin interfata FFmpegExecuteResponse Handler.
De exemplu, pentru a afla versiunea ffmpeg de pe dispozitiv este necesar de a introduce “-
version” ca argument.

Figura 2.2 Executarea FFmpeg


Metodele valabile
 loadBinary(FFmpegLoadBinaryResponseHandler
ffmpegLoadBinaryResponseHandler) throws FFmpegNotSupportedException
 execute(Map<String, String> environvenmentVars, String cmd,
FFmpegExecuteResponseHandler ffmpegExecuteResponseHandler) throws
FFmpegCommandAlreadyRunningException
 execute(String cmd, FFmpegExecuteResponseHandler
ffmpegExecuteResponseHandler) throws
FFmpegCommandAlreadyRunningException
 getDeviceFFmpegVersion() throws FFmpegCommandAlreadyRunningException
 getLibraryFFmpegVersion()
 isFFmpegCommandRunning()
 killRunningProcesses()
 setTimeout(long timeout)
Concluzii
In aceasta lucrare de an, am proiectat o aplicatie mobile pentru android care va descarca un video de la o
adresa URL cu ajutorul solutiei FFmpeg. FFmpeg face posibila aceasta functie datorita bibliotecilor pe
care le contine, si care au fost posibile de compilat pentru a putea fi citite de pe procesoarele arm care se
gasesc in dispozitivele mobile. Pentru a fi posibila compilarea bibliotecii pentru aplicatie android, a fost
necesara introducerea comenzilor in linia de comanda. Dupa aceasta bibicliotecile sunt compilate si gata
de incarcat in proiect. Pentru incarcarea in proiect se apeleaza la metodele ffmpeg, iar pentru utilizarea
ffmpeg se introduc comenzile ca parametru. La etapa care am ajuns nu este posibila introducerea si
executarea comengizlor prin interfata utilizatorului, executarea comenzilor poate avea loc doar prin
modificarea parametrului necesar in codul sursa. Scopul acestui proiect este nu doar de a descarca
videouri dintr-o anumita sursa, acesta poate fi folosit pentru a descarca videouri si ulterior privit offline.
Biblioteca FFmpeg pe langa descarcarea unui de video de la o anumita adresa URL permite si modificarea
formatului, modificarea frame-rate-ului, modificarea rezolutiei, modificarea denumirii fisierului sau a
locatiei. Cu ajutorul acestei biblioteci se poate de utilizat o multime de instructiune, partea cea mai buna
este ca acest soft este gratuit si utilizarea lui nu necesita o licenta. Scopul meu este de a dezvolta acest
proiect si in continuare, in primul rand de a crea o interfata cu care utilizatorul sa interactioneze intuitiv si
rapid, de a face astfel ca utilizatorul sa nu stie de instructiuni sau cod. De exemplu utilizatorul va alege
fisierul sursa, numele fisierului destinatie, si va alege toate modificarile care ar dori sa le execute. Dar
pentru toate acestea este necesar pentru a obtine cunostinte suplimentare, de investiga mai larg acest
subiect.
Bibliografie
 https://ffmpeg.org/documentation.html
 https://github.com/WritingMinds/ffmpeg-android-java
 http://writingminds.github.io/ffmpeg-android-java/
 https://www.w3schools.com/java
 https://ffmpeg.org/developer.html
Anexa
Codul sursa:
MainActivity:
package com.example.myapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

FFmpeg ffmpeg = FFmpeg.getInstance(context);


try {
ffmpeg.loadBinary(new LoadBinaryResponseHandler() {

@Override
public void onStart() {}

@Override
public void onFailure() {}

@Override
public void onSuccess() {}

@Override
public void onFinish() {}
});
} catch (FFmpegNotSupportedException e) {
}

FFmpeg ffmpeg = FFmpeg.getInstance(context);


try {
// to execute "ffmpeg -version" command you just need to pass "-
version"
ffmpeg.execute("ffmpeg -i
/storage/emulated/0/Pictures/RDT_20200216_1834133821008713377834180.mp4
-r 10 /storage/emulated/0/Pictures/vidosik.mp4", new
ExecuteBinaryResponseHandler() {
@Override
public void onStart() {}

@Override
public void onProgress(String message) {}

@Override
public void onFailure(String message) {}

@Override
public void onSuccess(String message) {}

@Override
public void onFinish() {}
});
} catch (FFmpegCommandAlreadyRunningException e) {
// Handle if FFmpeg is already running
}
}

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

Build.gradle
// Top-level build file where you can add configuration options common
to all sub-projects/modules.

buildscript {
repositories {
google()
jcenter()

}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.3'

// NOTE: Do not place your application dependencies here; they


belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
google()
jcenter()

}
}

task clean(type: Delete) {


delete rootProject.buildDir
}

apply plugin: 'com.android.application'

android {
compileSdkVersion 29
buildToolsVersion "29.0.3"

defaultConfig {
applicationId "com.example.myapp"
minSdkVersion 16
targetSdkVersion 29
versionCode 1
versionName "1.0"

testInstrumentationRunner
"androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-
optimize.txt'), 'proguard-rules.pro'
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])

implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-
core:3.2.0'
compile 'com.writingminds:FFmpegAndroid:0.3.2'
}

BuildConfig.java
/**
* Automatically generated file. DO NOT MODIFY
*/
package com.example.myapp;

public final class BuildConfig {


public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.example.myapp";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
}

S-ar putea să vă placă și