[TUTORIAL] Viết app sửa file mp4 bị hỏng – Phần 1

Chào các bạn. Hôm nay mình sẽ hướng dẫn các bạn viết một app Android đơn giản để sửa file mp4 bị hỏng. Sửa file mp4 bị hỏng là 1 task khá phức tạp, nhưng nếu các bạn chịu khó tìm tòi một chút thì sẽ thu được thành quả đấy. Mình sẽ chia tutorial thành 2 phần. Trong phần 1 này thì mình sẽ giới thiệu chung về vấn đề, nguyên nhân và giải pháp. Phần 2 sẽ nói chi tiết cách làm.

File mp4 bị hỏng trong trường hợp nào?
Khi bạn đang quay video (bằng camera) hoặc quay video màn hình (screen record),  điện thoại có thể đột ngột sập pin, app bị crash hoặc một lý do nào đó khiến tác vụ quay video bị hỏng. Kết quả là ta thu được 1 file mp4 có chứa dữ liệu nhưng không thể xem được bằng bất kì ứng dụng media player nào. Hậu quả là bạn có thể mất những đoạn phim quan trọng mà bạn đã ghi hình.

Rất nhiều người sẽ đành phải xoá video bị hỏng đi. Nhưng chúng hoàn toàn có thể được khôi phục.

Tại sao file mp4 không xem được?
Khi bạn dùng ffmpeg để đọc hoặc phân tích một file mp4 bị hỏng, bạn sẽ nhận được thông báo: không tìm thấy moov atom. Thiếu moov atom –  Đó chính là nguyên nhân.

Moov atom là gì?

Để trả lời câu hỏi này, chúng ta cần xem xét cấu trúc file mp4.

mp4 file structure

File mp4 thực chất là một chuỗi các box (hay còn gọi là atom).  Thông thường thì một file mp4 sẽ có 3 atom chính đó là:
– ftyp atom: loại file;
– mdat atom: chứa dữ liệu raw về hình ảnh (video) và âm thanh (audio).
– moov atom: chứa thông tin cơ bản để giúp media player có thể đọc được video.

Cấu tạo chi tiết của mdat atom chúng ta sẽ tìm hiểu ở phần 2. Nói chung thì mdat atom là một tập hợp các khối dữ liệu video và audio (gọi là các chunk) đặt xen kẽ nhau. moov atom lưu trữ thông tin về resolution (1920 x 1080, …), bitrate (5Mbps…), codec (H264, H265…) và thông tin về vị trí (index) của các khối dữ liệu video và audio cũng như thời gian hiển thị chúng.

Thông thường các encoder đặt moov atom ở cuối file, bởi vì chỉ khi nào kết thúc quá trình ghi hình thì mới có đầy đủ thông tin về index của audio và video để lưu trong moov atom. Chính vì thế nếu tác vụ ghi hình bị dừng đột ngột, file sẽ thiếu mất moov atom. Điều này khiến các video player không thể lấy được thông tin về codec, audio và video để chạy.

Giải quyết vấn đề
Cách duy nhất để giải quyết vấn đề là tái tạo lại moov atom bị mất.

Câu hỏi đặt ra là có thể sử dụng moov atom của một video khác (có cùng cấu hình) để chèn vào video bị hỏng hay không? Câu trả lời là có, nhưng chưa đủ.
Chú ý rằng nếu ta có 2 video  được quay bởi cùng một thiết bị và cùng một cài đặt cấu hình, chúng sẽ có chung những thông số như độ phân giải, bitrate, codec,… và khác nhau về thời lượng (duration), index của các khối dữ liệu video và audio.

Như vậy đầu tiên ta sẽ tạo quay thêm 1 video có cùng cấu hình và mượn moov atom của video đó làm khung để tái tạo lại moov atom cho video bị hỏng.
Tiếp theo công việc sẽ là khôi phục lại dữ liệu về duration, index của các khối audio và video.

Hãy đọc tiếp phần 2 của tutorial để xem chi tiết cách sửa file mp4 bị hỏng nhé!