Sách

Thứ Hai, 9 tháng 9, 2019

Project: vlc-android

https://www.programcreek.com/java-api-examples/?code=xuie0000%2Fvlc-android%2Fvlc-android-master%2F#

Thứ Bảy, 31 tháng 8, 2019

OnSingleClickListener

Java:
public abstract class OnSingleClickListener implements View.OnClickListener {

    private static final long MIN_CLICK_INTERVAL = 800;

    private long mLastClickTime;

    public abstract void onSingleClick(View view);

    @Override
    public final void onClick(View view) {
        long currentClickTime = SystemClock.uptimeMillis();
        long elapsedTime = currentClickTime - mLastClickTime;
        mLastClickTime = currentClickTime;
        if(elapsedTime < MIN_CLICK_INTERVAL)
            return;
        onSingleClick(view);        
    }

}


Kotlin:
abstract class OnSingleClickListener : View.OnClickListener {

    private var mLastClickTime: Long = 0

    abstract fun onSingleClick(view: View)

    override fun onClick(view: View) {
        val currentClickTime = SystemClock.uptimeMillis()
        val elapsedTime = currentClickTime - mLastClickTime
        mLastClickTime = currentClickTime
        if (elapsedTime < MIN_CLICK_INTERVAL)
            return
        onSingleClick(view)
    }

    companion object {
        private const val MIN_CLICK_INTERVAL: Long = 800
    }
}

Thứ Tư, 3 tháng 7, 2019

20 Website download sách miễn phí cho những người ham mê đọc sách

20 Website download sách miễn phí cho những người ham mê đọc sách

"Sách là nơi lưu giữ nền văn minh, không có sách, lịch sử trầm lặng, văn chương buồn chán".

Dưới đây là một loạt các website Download sách miễn phí hi vọng sẽ giúp bạn tìm thấy được những cuốn sách mà bạn đang cần. 
1. http://www.loyalbooks.com/  : Với hơn 7000 ebook có cả audio để các bạn nghe, đủ các file trên điện thoại.
2. http://downloadsachfree.com : Bạn sẽ tìm được quyển ebook hay thuộc nhiều thể loại. Trang web này luôn cập nhật những sách hay ở nhiểu lĩnh vực, kinh doanh, làm giàu, kỹ năng, phát triển bản thân,...
3. http://www.ebookbkmt.com/  : Download tài liệu về kỹ thuật miễn phí.
20 Website download sách miễn phí cho những người ham mê đọc sách
4. http://avaxhome.ws : Là một trong những trang download sách miễn phí rất lớn. 
5. http://sachvui.com : Thư viện sách miễn phí, Ebook miễn phí, tổng hợp nhiều thể loại với nhiều định dạng file. 
6. http://www.taisachhay.com : Xem, đọc, tải sách hay, sách điện tử miễn phí về cho điện thoại, máy tính, máy tính bảng.
7. http://www.free-ebooks.net/ : Tại web này bạn có thể nhận được các thể loại sách về điện tử, giải trí, viễn tưởng, giáo dục, lãng mạn, phi tiểu thuyết, truyện ngắn… và nhiều hơn thế nữa.
8. http://comicsdownload.org/ : Dành cho các bạn thích đọc truyện tranh.
9http://www.englishtips.org/  : Có rất nhiều tài liệu cho việc học tiếng anh. 
10. http://trangtaiebookfree.blogspot.com/  :  Hãy vào đây để tải cho mình những quyển sách hay được tuyển chọn kỹ lưỡng.
11. https://webtietkiem.com/free/  : Trang web này cũng có rất nhiều sách hay, bạn có thể tải sách chỉ với 1 click.
12www.Beenvn.com :  Trang download sách free toàn link Mediafire. 
20 Website download sách miễn phí cho những người ham mê đọc sách
13. http://www.ebookandyou.com/  : Tiểu thuyết nước ngoài và trong nước rất phong phú.
14. http://tve-4u.org/  : Sách tiếng việt rất đa dạng.
15. http://manybooks.net : Cung cấp hơn 25000 ebook miễn phí các loại. Bạn có thể tìm ebook theo: tên tác giả, nhan đề, thể loại hay ngôn ngữ viết sách, nhưng hiện tại web này chưa có Tiếng Việt. 
16. http://www.docsachtienganh.com/  : Luyện đọc tiếng anh mỗi ngày.
17. http://ebook3000.com/  : Thư viện tải ebook miễn phí cung cấp đa dạng các thể loại sách thuộc nhiều lĩnh vực được sắp xếp riêng biệt như: kinh doanh, thiết kế đồ họa...    
18. https://komo.vn/ : Với hơn 500 quyển tiếng anh miễn phí, đặc biệt hơn là bạn có thể cài app komo reader vào điện thoại để đọc thỏa mái.  
19. https://it-ebooks.info/ : trang web ebook hàng đầu dành cho dân IT. Các sách về lập trình và CNTT nổi tiếng trên thế giới đều được chia sẻ ở đây.     
20http://ikindlebooks.com: Ebook miễn phí, rất nhiều sách về Best Seller.       
Theo YBOX.VN

Thứ Hai, 24 tháng 6, 2019

Đào tạo android

1. Tài liệu tự học:

- Kênh youtube tham khảo:
+ https://www.youtube.com/user/khoazend/playlists
- Lộ trình tự học tham khảo:
+ https://khoapham.vn/khoa-hoc-lap-trinh-android.html
+ http://itplus-academy.edu.vn/Khoa-hoc-lap-trinh-ung-dung-di-dong-Android.html
+ https://techmaster.vn/khoa-hoc/25513/lap-trinhandroid

2. Công việc:
- Xây dựng màn hình tab EDM của app Keeng. Yêu cầu:
+ Hiển thị đầy đủ dữ liệu lên màn hình (giao diện giống hệt tab EDM app Keeng hiện tại)
+ Click vào mỗi item đều có phản hồi
+ Có cache dữ liệu khi mở app lên mà không có mạng
+ Tự động load lại dữ liệu khi từ trạng thái mất mạng -> có mạng
+ Chơi được video và audio.

API lấy dữ liệu: /ws/edm/getHomeEdmV1
Method: GET
Header:
+ version: version name của ứng dụng
+ session_token: t:s:425f539317e5d9c79216ccc1c37954b2d81d9ab5
+ country_code: VN
+ device_id: imei của máy
+ client_type: 1
+ revision: version code của ứng dụng
+ language_code: vi
+ local_code: 84
Param:
+ platform: keeng

API log hành vi click: /ws/social/user/log
Method: POST
Header:
+ version: version name của ứng dụng
+ session_token: t:s:425f539317e5d9c79216ccc1c37954b2d81d9ab5
+ country_code: VN
+ device_id: imei của máy
+ client_type: 1
+ revision: version code của ứng dụng
+ language_code: vi
+ local_code: 84
Param:
+ item_type: item_type của object trong api getHomeEdmV1 trả về
+ is_feed: 1
+ item_id: id của object trong api getHomeEdmV1 trả về
+ action_type: 1

3. Kết quả cần thu được:
- Có hiểu biết xây dựng ứng dụng từ việc tạo project
- Có kiến thức cơ bản về kiến trúc ứng dụng
- Nắm vững các kiến thức về các vòng đời: activity, fragment. Các giao tiếp giữa activity với activity, fragment với fragment, activity với fragment.
- Có kiến thức cơ bản về service, broadcast.
- Biết sử dụng thư viện để load ảnh, cache ảnh
- Biết sử dụng SQLite thiết kế database cho ứng dụng
- Biết sử dụng cache
- Biết sử dựng thư viện để gọi API kết nối với server
- Biết sử dụng thư viện để chơi nhạc, video

Thứ Tư, 6 tháng 3, 2019

[Android] Lấy danh sách tất cả ứng dụng trong thiết bị

public static List<AppInfo> getInstalledPackages(Context context) {
//todo get all applications has installed on device.
PackageManager packageManager = context.getPackageManager();
List<AppInfo> list = new ArrayList<>();
List<PackageInfo> packs = packageManager.getInstalledPackages(0);

for (PackageInfo packageInfo : packs) {
try {
AppInfo item = new AppInfo();
ApplicationInfo applicationInfo = packageInfo.applicationInfo;
item.setName(applicationInfo.loadLabel(packageManager));
item.setPackageName(packageInfo.packageName);
item.setVersionName(packageInfo.versionName);
item.setVersionCode(packageInfo.versionCode);
item.setDescription(applicationInfo.loadDescription(packageManager));
item.setIcon(applicationInfo.loadIcon(packageManager));
//item.setLogo(applicationInfo.loadLogo(packageManager));
//item.setBanner(applicationInfo.loadBanner(packageManager));
item.setSystem(((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0));

//todo get all requested permissions of application
PackageInfo packageInfoPermissions =
packageManager.getPackageInfo(packageInfo.packageName, PackageManager.GET_PERMISSIONS);
if (packageInfoPermissions != null) {
String[] requestedPermissions = packageInfoPermissions.requestedPermissions;
if (requestedPermissions != null) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < requestedPermissions.length; i++) {
sb.append((i + 1));
sb.append(". ");
sb.append(requestedPermissions[i]);
sb.append("\n");
}
item.setPermission(sb.toString());
}
}
list.add(item);
} catch (OutOfMemoryError | Exception e) {
e.printStackTrace();
}
}
if (list.size() > 0) {
Comparator comparator = new Comparator<AppInfo>() {
@Override
public int compare(final AppInfo leftObject, final AppInfo rightObject) {
return leftObject.getName().compareToIgnoreCase(rightObject.getName());
}
};
Collections.sort(list, comparator);
}
Log.i(TAG, "getInstalledPackages: " + list);
return list;
}

public class AppInfo implements Serializable {
String packageName;
String versionName;
int versionCode;
String name;
String description;
Drawable logo;
Drawable icon;
Drawable banner;
boolean isSystem;
String permission;

public AppInfo() {
}

public String getPackageName() {
return packageName;
}

public void setPackageName(final String packageName) {
this.packageName = packageName;
}

public String getVersionName() {
return versionName;
}

public void setVersionName(final String versionName) {
this.versionName = versionName;
}

public int getVersionCode() {
return versionCode;
}

public void setVersionCode(final int versionCode) {
this.versionCode = versionCode;
}

public String getName() {
if (name == null)
name = "";
return name;
}

public void setName(final CharSequence name) {
if (name != null)
this.name = name.toString();
else
this.name = "";
}

public void setName(final String name) {
this.name = name;
}

public String getDescription() {
return description;
}

public void setDescription(final CharSequence description) {
if (description != null)
this.description = description.toString();
else
this.description = "";
}

public void setDescription(final String description) {
this.description = description;
}

public Drawable getLogo() {
return logo;
}

public void setLogo(final Drawable logo) {
this.logo = logo;
}

public Drawable getIcon() {
return icon;
}

public void setIcon(final Drawable icon) {
this.icon = icon;
}

public Drawable getBanner() {
return banner;
}

public void setBanner(final Drawable banner) {
this.banner = banner;
}

public boolean isSystem() {
return isSystem;
}

public void setSystem(final boolean system) {
isSystem = system;
}

public String getPermission() {
return permission;
}

public void setPermission(String permission) {
this.permission = permission;
}

@Override
public String toString() {
return "\n{" +
"packageName='" + packageName + '\'' +
", versionName='" + versionName + '\'' +
", versionCode=" + versionCode +
", name='" + name + '\'' +
", description='" + description + '\'' +
", isSystem=" + isSystem +
'}';
}
}

Thứ Hai, 4 tháng 3, 2019

[ffmpeg Tutorial] Convert Video Thành Webm Với Ffmpeg

Câu lệnh convert video thành WEBM

Định dạng WEBM sử dụng chuẩn codec vp8 của Google. Và để convert video thành WEBM với FFmpeg, bạn có thể sử dụng thư viện libvpx để encode video và thư viện libvorbis để encode audio.
Câu lệnh cơ bản:
ffmpeg -i input.mp4 -f webm -c:v libvpx -b:v 1M -c:a libvorbis output.webm -hide_banner
Trong đó:
  • -i là cờ dùng để xác định input, sau đó là tên file (input.mp4)
  • -f dùng để xác định format của file output, sau đó là tên định dạng (webm).
  • -c:v dùng để xác định codec sử dụng cho video, sau đó là tên thư viện sử dụng libvpx
  • -b:v dùng để xác định bitrate cho video đầu ra. Sau đó là số bitrate 1M. Chú ý: ở đây mình sử dụng số liệu chính xác là 1M. Trong khi với MP4, mình chỉ có thể xác định maxrate.
  • -c:a dùng để xác định codec sử dụng cho audio, sau đó là tên thư viện sử dụng libvorbis
  • output.webm là tên file output.
  • -hide_banner dùng để ẩn những thông tin liên quan đến FFmpeg (phiên bản, các thư viện sử dụng,…)
Kết quả:
Convert video thành WEBM
Convert video thành WEBM
Ngoài ra, bạn cũng có thể thêm các tham số để điều chỉnh về độ phân giải (-vf scale=1280:729) hoặc tốc độ framerate (-r 20),… để được kết quả như mong đợi.

So sánh WEBM với MP4

  • WEBM sử dụng thư viện libvpx để encode video theo chuẩn vp8 và thư viện libvorbis để encode audio. Còn MP4 sử dụng thư viện libx264 để encode video theo chuẩn H264 và thư viện aac để encode audio.
  • Convert video thành WEBM thường lâu hơn rất nhiều so với convert video thành MP4.
  • WEBM nén tốt hơn, cho video chất lượng tốt hơn với dung lượng nhỏ hơn MP4.
  • WEBM phù hợp với việc sử dụng video trên nền web. Tuy nhiên, không phải trình duyệt nào cũng hỗ trợ như MP4.

Lời kết

Trên đây là câu lệnh cơ bản để convert video thành WEBM với FFmpeg. Nếu có gì thắc mắc, vui lòng để lại câu hỏi trong phần bình luận nhé. Mình sẽ cố gắng giải đáp nếu có thể.
Xin chào và hẹn gặp lại!

[ffmpeg Tutorial] Split Video Với Ffmpeg

Câu lệnh cơ bản để split video với FFmpeg

Giả sử mình có một video dài 1 tiếng (60 phút) và mình muốn chia nhỏ video này thành các phần nhỏ hơn, mỗi phần có độ dài 5 phút. Khi đó, câu lệnh FFmpeg là:
ffmpeg -i input.mp4 -c copy -f segment -segment_time 300 -reset_timestamps 1 %03d.mp4
Trong đó:
  • -i là cờ dùng để xác định input, sau đó là tên file (input.mp4).
  • -c copy dùng để thông báo với FFmpeg rằng bạn muốn copy video và audio từ input sang output mà không phải encode lại. Tham số này tương đương với -vcodec copy -acodec copy.
  • -f segment nghĩa là bạn muốn chia video này thành các segment (đoạn).
  • -segment_time 300: xác định độ dài mỗi đoạn là 300 giây (tương đương với 5 phút).
  • -reset_timestamps 1: để bắt mỗi segment bắt đầu với timestamp sấp xỉ 0.
  • %03d.mp4: định dạng file output. Trong trường hợp này, tên các file có độ dài là 3 kí tự, tức 001.mp4, 002.mp4,…

Lời kết

Trên đây là cách để cut video vời FFmpeg. Nếu có gì thắc mắc hay góp ý, bạn vui lòng để lại câu hỏi xuống phần bình luận. Mình sẽ cố gắng giải đáp.
Xin chào và hẹn gặp lại!

[ffmpeg Tutorial] Ghép Nối Video Với Ffmpeg

Ghép nối video với FFmpeg đơn giản

Nếu bạn có 2 hay nhiều video định dạng avi hoặc mpg thì có thể sử dụng câu lệnh sau:
ffmpeg -i "concat:video1.avi|video2.avi" output.avi
Trong đó:
  • -i là cờ dùng để xác định input, sau đó là đoạn string có dạng “concat:video1.avi|video2.avi|…|videoN.avi”.
  • output.avi là tên file output, với định dạng giống như các file input.
Đối với video dạng MP4, WEBM, MKV thì bạn không thể sử dụng câu lệnh trên được mà cần phải sử dụng cách sau đây.

Ghép nối video sử dụng Concat Filter

Nếu sử dụng cách này, bạn có thể ghép nối video với các định dạng khác nhau.
Giả sử mình cần ghép 1 video MP4 với 1 video AVI thì câu lệnh là:
ffmpeg -i video1.mp4 -i video2.avi -filter_complex "[0:v:0] [0:a:0] [1:v:0] [1:a:0] concat=n=2:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" output.mp4
Trong đó:
  • -i là cờ dùng để xác định input, sau đó là tên file (video1.mp4, video2.avi)
  • -filter_complex dùng để áp dụng filter, sau đó là công thức filter – nằm trong cặp dấu ngoặc kép
    • [0:v:0] là video stream của file thứ nhất[0:a:0] là audio stream của file thứ nhất[1:v:0] là video stream của file thứ hai[1:a:0] là audio stream của file thứ haiconcat=n=2:v=1:a=1để xác định FFmpeg sẽ ghép nối (concat) 2 video (n=2) thành 1 video với 1 video stream (v=1) và 1 audio stream (a=1).[v] [a] lần lượt là kết quả của video stream và audio stream, để sử dụng trong phần sau
  • -map “[v]” -map “[a]” dùng để xác định rằng FFmpeg sẽ sử dụng video stream và audio stream từ bước trước (thay vì input) để đưa ra output.
  • output.mp4 là tên file output
Chú ý: Nếu file input có kích thướctốc độ framerate và SAR khác nhau thì bạn cần phải xử lý video trước cho chúng về cùng kích thước, cùng tốc độ framerate và cùng SAR.
Trên đây là cách để ghép nối 2 video. Còn nếu bạn muốn ghép 3 video (hoặc nhiều hơn) thì câu lệnh sẽ trở thành:
ffmpeg -i video1.mp4 -i video2.avi -i video3.webm -filter_complex "[0:v:0] [0:a:0] [1:v:0] [1:a:0] [2:v:0] [2:a:0] concat=n=3:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" output.mp4

Ghép nối video không có audio

Nếu bạn muốn ghép nối video nhưng trong đó không có audio stream, bạn chỉ cần áp dụng công thức tương tự như trên nhưng bỏ đi những thành phần liên quan đến audio là được.
ffmpeg -i video1.mp4 -i video2.avi -filter_complex "[0:v:0] [1:v:0] concat=n=2:v=1 [v]" -map "[v]" output.mp4

Lời kết

Trên đây là một số cách để ghép nối video với FFmpeg. Nếu có gì thắc mắc hay góp ý, bạn vui lòng để lại câu hỏi xuống phần bình luận. Mình sẽ cố gắng giải đáp.
Xin chào và hẹn gặp lại!

[ffmpeg Tutorial] Tách Audio Từ Video Với Ffmpeg

Tách audio từ video giữ nguyên gốc

Trước khi làm việc này bạn cần phải biết định dạng audio sử dụng trong một số loại video, ví dụ:
  • Nếu video định dạng MP4 thì audio dạng .aac
  • Nếu video định dạng WEBM thì audio dạng .oga
  • … (chắc còn nhiều nhưng mình không rành lắm)
Giả sử mình muốn tách nguyên gốc audio từ video MP4, thì câu lệnh là:
ffmpeg -i input.mp4 -vn -acodec copy output.aac
Trong đó:
  • -i là cờ dùng để xác định input, sau đó là tên file (input.mp4)
  • -vn là cờ dùng để xác định rằng mình không sử dụng video ở output
  • -acodec copy là cờ dùng để xác định rằng FFmpeg sẽ copy audio từ input sang output mà không encode lại.
  • output.aac là tên file output
Kết quả là mình đã có một file raw audio là output.aac.

Tách audio từ video và encode sang định dạng khác

Bạn có thể tách audio từ video rồi encode nó sang định dạng khác quen thuộc hơn, như mp3wma,…
Giả sử mình muốn encode video thành mp3 thì câu lệnh là:
ffmpeg -i input.mp4 -vn output.mp3
Câu lệnh này gần giống câu lệnh trên. Chỉ khác ở chỗ mình bỏ qua tham số liên quan đến copy audio (-acodec copy) và file audio đầu ra với đuôi là định dạng mình muốn convert (mp3).
FFmpeg sẽ dựa vào đuôi này để biết rằng nó sẽ phải encode audio như thế nào.
Ngoài ra, bạn cũng có thể chỉ định rõ định dạng output theo chuẩn nào.

Tách audio thành mp3

ffmpeg -i input.mp4 -vn -acodec mp3 output.mp3

Tách audio thành aac

ffmpeg -i input.mp4 -vn -acodec aac output.aac

Tách audio thành vorbis

ffmpeg -i input.mp4 -vn -acodec libvorbis output.oga
Chú ý: Nếu làm theo cách này, bạn cần biết rõ định dạng file tương ứng với chuẩn encode.
  • -acodec mp3 ứng với định dạng .mp3
  • -acodec aac ứng với định dạng .aac
  • -acodec libvorbis ứng với định dạng .oga

Lời kết

Trên đây là một số cách để tách audio từ video với FFmpeg. Nếu có gì thắc mắc hay góp ý, bạn vui lòng để lại câu hỏi xuống phần bình luận. Mình sẽ cố gắng giải đáp.
Xin chào và hẹn gặp lại!

[ffmpeg Tutorial] Cut Video Với Ffmpeg

Câu lệnh cơ bản

Ví dụ để cắt video từ thời điểm 2 giây, với thời lượng cắt là 3 giây, câu lệnh cần dùng là:
ffmpeg -i input.mp4 -ss 00:00:02.0000 -t 3 output.mp4
Trong đó:
  • -i là cờ dùng để xác định input, sau đó là tên file (input.mp4)
  • -ss (start timestamp) dùng để xác định thời điểm bắt đầu cắt video, theo định dạng (giờ:phút:giây:mili-giây). Trong câu lệnh trên 00:00:02.0000 ứng với thời điểm giây thứ 2. Ngoài ra, nếu bạn chỉ dùng -ss 2 thì FFmpeg cũng mặc định hiểu rằng, đó là thời điểm 2 giây.
  • -t là cờ dùng để xác định thời lượng bạn muốn cắt. Sau đó là con số chỉ thời lượng đó, ở đây là 3 giây.
  • output.mp4 là tên file output
Trong câu lệnh trên, ngoài tham số -t, bạn có thể sử dụng tham số -to để thay thế. Tham số -todùng đề xác định thời điểm kết thúc bạn muốn cắt video. Ví dụ mình muốn cắt video ở thời điểm 5 giây thì có thể sử dụng một trong 2 câu lệnh dưới đây:
ffmpeg -i input.mp4 -ss 00:00:02.0000 -to 00:00:05.0000 output.mp4

# Hoặc
ffmpeg -i input.mp4 -ss 2 -to 5 output.mp4
Kết quả thu được hoàn toàn giống với câu lệnh ban đầu.
Tuy nhiên, có một điều bạn cần lưu ý là câu lệnh trên sẽ encode lại video dựa theo những tham số mặc định của FFmpeg. Nếu bạn muốn giữ nguyên thông tin video, không encode lại video thì mời bạn theo dõi phần dưới đây.

Không encode lại video

Để làm điều này, bạn có thể sử dụng thêm option -c copy (hoặc -vcodec copy với video và -acodec copy với audio) để FFmpeg copy trực tiếp video từ input sang output mà không cần phải encode lại video nữa.
Điều này có 2 ưu điểm:
  • Giữ nguyên chất lượng video ban đầu
  • Giúp cắt video nhanh hơn
Câu lệnh cần dùng là:
ffmpeg -i input.mp4 -ss 2 -t 3 -c copy output.mp4

Lời kết

Trên đây là cách để cut video với FFmpeg. Nếu có gì thắc mắc hay góp ý, bạn vui lòng để lại câu hỏi xuống phần bình luận. Mình sẽ cố gắng giải đáp.
Xin chào và hẹn gặp lại!

[ffmpeg Tutorial] Crop Video Với Ffmpeg

Crop video với FFmpeg

Câu lệnh cơ bản

ffmpeg -i input.mp4 -vf "crop=w:h:x:y" output.mp4
Trong đó:
  • -i là cờ dùng để xác định input, sau đó là tên file (input.mp4)
  • -vf dùng để thông báo việc sử dụng video filter. Tiếp theo đó là công thức sử dụng. Để crop video với FFmpeg thì mình sử dụng công thức là crop=w:h:x:y.
    • w: là chiều rộng video mà bạn muốn thu được.h: là chiều cao video mà bạn muốn thu được.x: là toạ độ trên trục x điểm top, left của video mong muốn, mặc định x = 0.y: là toạ độ trên trục y điểm top, left của video mong muốn, mặc định y = 0.
  • output.mp4 là tên file output

Hệ trục toạ độ

Có thể bạn vẫn chưa hiểu rõ câu lệnh trên cho lắm. Nên mình đã chuẩn bị một hình minh hoạ cho bạn dễ hiểu hơn:


Hệ trục tọa độ trên video
Hệ trục tọa độ trên video

Ví dụ minh hoạ

Giả sử mình có một video với độ phân giải 1920×1080. Mình muốn crop lấy video với độ phân giải 1280×720 và điểm top, lef có toạ độ là (320, 180).
Khi đó, mình có w = 1280, h = 720, x = 320, y = 180. Suy ra câu lệnh cần dùng là:
ffmpeg -i input.mp4 -vf "crop=1280:720:320:180" output.mp4

Sử dụng biến số

Trong ví dụ trên, mình cố tình cắt lấy video nằm ở chính giữa của video gốc (cách đều 4 phía).
Vì mình đã chủ động tính toán:
  • x = 320 = (1920 – 1280) / 2
  • y = 180 = (1080 – 720) / 2
Hay tổng quát hoá: để cắt lấy video có kích thước w, h từ video gốc W, H và cách đều 4 phíathì:
  • x = (W – w) / 2
  • y = (H – h) / 2
Trong đó:
  • Giá trị w, h là giá trị mình mong muốn
  • Giá trị W, H là giá trị kích thước video ban đầu. Dĩ nhiên, bạn có thể lấy được kích thước của video này thủ công. Hoặc bạn có thể sử dụng biến số có sẵn cung cấp bởi FFmpeg. Đó là in_w tương ứng với chiều rộng video gốc, in_h tương ứng với chiều cao video gốc.
Nếu áp dụng biến số này thì câu lệnh trong ví dụ trên trở thành:
ffmpeg -i input.mp4 -vf "crop=1280:720:(in_w-1280)/2:(in_h-720)/2" output.mp4

Lời kết

Trên đây là cách để crop video với FFmpeg. Nếu có gì thắc mắc hay góp ý, bạn vui lòng để lại câu hỏi xuống phía dưới. Mình sẽ cố gắng giải đáp nhé!
Xin chào và hẹn gặp lại!