2015-10-20 32 views
13

Tôi đã quay video từ máy ảnh trong ứng dụng của mình và được lưu trong bộ nhớ thiết bị.Bây giờ tôi muốn đảo ngược video sao cho video phát từ backwards.i.e. nếu video là 10 giây thì khung cuối cùng ở giây thứ 10 sẽ trở thành khung hình đầu tiên và nó bắt đầu phát từ đó đến khung hình thứ nhất đầu tiên. Tôi muốn lưu video bị đảo ngược trong tệp. Tôi nên tiến hành như thế nào?Đảo ngược video trong android

+0

kiểm tra bài viết này thực sự hữu ích http://andrey.chernih.me/2014/06/28/video-recording-and-processing-in-android/ –

+0

@MohanadKholy bài viết gud của nó. Nhưng tôi không thể tìm cách đảo ngược video trong đó? –

+0

điều này không liên quan đến android này là một cái gì đó liên quan đến videolibrary mà có thể đảo ngược video của bạn – raj

Trả lời

1

Nhờ Mick đã cho tôi ý tưởng sử dụng ffmpeg để đảo ngược video.

Tôi đã đăng mã tại github để đảo ngược video cùng với thực hiện thao tác chỉnh sửa video khác bằng cách sử dụng hướng dẫn ffmpeg và đầy đủ trong bài đăng blog của tôi here.

Theo văn bản trong bài viết trên blog của tôi,

Đối đảo ngược video, đầu tiên chúng ta cần phải chia video thành các đoạn với kéo dài từ 10 giây hoặc ít hơn vì lệnh video đảo cho ffmpeg sẽ không làm việc cho thời gian dài video trừ khi thiết bị của bạn có 32 GB RAM.

Do đó, để đảo ngược video-

1. Chia nhỏ video thành các đoạn có thời lượng từ 10 giây trở xuống.

2.Reverse video phân đoạn

3.Concatenate đảo ngược video phân đoạn theo thứ tự ngược.

Đối với chia video thành các đoạn với thời gian 6 giây chúng ta có thể sử dụng dưới đây Command-

String [] complexCommand = { "-i", inputFileAbsolutePath, "-c: v", "libx264 "," -crf "," 22 "," -map "," 0 "," -segment_time "," 6 "," -g "," 9 ", " -sc_threshold "," 0 "," - force_key_frames "," expr: gte (t, n_forced * 6) ", " -f "," phân đoạn ", outputFileAbsolutePath};

Ở đây,

-c: v libx264

mã hóa tất cả các video suối với libx264

-crf

Đặt chất lượng đối với chế độ chất lượng không đổi.

-segment_time

thời gian cho từng phân đoạn video

-g

GOP kích thước

-sc_threshold

thay đổi ngưỡng cảnh bộ.

-force_key_frames expr: gte (t, n_forced * n)

Buộc một keyframe mỗi n giây

Sau khi phân đoạn video, chúng ta cần phải đảo ngược videos.For phân đoạn mà chúng ta cần để chạy một vòng lặp nơi mỗi tệp video được phân đoạn sẽ bị đảo ngược .

Để đảo ngược một đoạn video với âm thanh (không loại bỏ âm thanh của nó), chúng tôi có thể sử dụng dưới đây Command-

Chuỗi lệnh [] = { "-i", inputFileAbsolutePath, "-vf", "đảo ngược" , "-af", "nghịch đảo", outputFileAbsolutePath};

Để đảo ngược một đoạn video với âm thanh loại bỏ âm thanh của nó chúng ta có thể sử dụng dưới đây Command-

Chuỗi lệnh [] = { "-i", inputFileAbsolutePath, "-an", "-vf", "đảo ngược", outputFileAbsolutePath};

Để đảo ngược một video mà không cần âm thanh, chúng tôi có thể sử dụng dưới đây Command-

Chuỗi lệnh [] = { "-i", inputFileAbsolutePath, "-vf", "đảo ngược", outputFileAbsolutePath};

Sau khi đảo ngược video phân đoạn, chúng ta cần phải nối đảo ngược video phân đoạn trong order.For ngược rằng chúng tôi sắp xếp video trên cơ sở của tập tin sửa đổi lần cuối sử dụng Arrays.sort (file, LastModifiedFileComparator.LASTMODIFIED_REVERSE).

Sau đó, để nối đảo ngược video phân đoạn (với âm thanh), chúng tôi có thể sử dụng dưới đây Command-

Chuỗi lệnh [] = { "-i", inputFile1AbsolutePath, "- tôi", inputFile2AbsolutePath . ...., "- i", inputFileNAbsolutePath, "- filter_complex", "[0: v0] [0: a0] [1: v1] [1: a1] ... [N: vN] concat = n = N: v = 1: a = 1 [v] [a], "- bản đồ", "[v]", "- bản đồ", "[a]", outputFileAbsolutePath};

Để ghép nối video được phân đoạn bị đảo ngược (không có âm thanh), chúng tôi có thể sử dụng bên dưới Command-

Chuỗi lệnh [] = { "-i", inputFile1AbsolutePath, "- tôi", inputFile2AbsolutePath ..... "- i", inputFileNAbsolutePath, "- filter_complex", "[0 : 0] [1: 0] [2: 0] ... [N: 0] concat = n = N: v = 1: a = 0 ", outputFileAbsolutePath};

Ở đây,

-filter_complex [0: v0] [0: a0] [1: v1] [1: a1] ... [N: vN] nói với ffmpeg gì suối để gửi đến các bộ lọc concat. Trong trường hợp trên, luồng video 0 [0: v0] và luồng âm thanh 0 [0: a0] từ đầu vào 0, luồng video 1 [1: v1] và luồng âm thanh 1 [1: v1] từ đầu vào 1 và như vậy trên.

lọc concat được sử dụng để nối các đoạn audio và video, tham gia chúng lại với nhau một sau khi lọc other.The chấp nhận tùy chọn sau:

n

Đặt số phân khúc. Mặc định là 2.

v

Đặt số dòng video đầu ra, đó cũng là số dòng video trong từng phân khúc. Mặc định là 1.

một

Đặt số suối âm thanh đầu ra, đó cũng là số suối âm thanh trong từng phân khúc. Mặc định là 0.

+0

Làm cách nào để thực hiện giải pháp này nếu tôi có thể hỏi. Bởi vì thời gian qua tôi tinker với ffmpeg trên Android, hiệu suất không phải là tuyệt vời. Sẽ mất 50 giây để thao tác video dài 15 giây, ngay cả với tất cả tối ưu hóa tôi có thể tìm thấy. –

+0

@ vxh.viet Quá trình đảo ngược video sẽ mất một chút thời gian.FFmpeg cung cấp các giá trị đặt trước nhất định là tập hợp các tùy chọn cung cấp tốc độ nhất định cho quy trình. Utrafast cài đặt trước là đặc biệt hữu ích để tăng tốc độ process.To sử dụng cài đặt trước chỉ cần thêm "-preset", "cực nhanh" để lệnh.Xin vui lòng kiểm tra [ở đây] (https://trac.ffmpeg.org/wiki/Encode/H .264) để có giải thích chi tiết về cách chọn giá trị đặt trước. Ngoài ra, bạn nên sử dụng cài đặt sẵn chậm nhất mà bạn có kiên nhẫn. –

6

Nếu bạn đang chuẩn bị để sử dụng ffmpeg bạn có thể sử dụng phương pháp này - nó về cơ bản phá vỡ các đoạn video vào khung và sau đó xây dựng lại theo thứ tự ngược:

Có một số cách để sử dụng ffmpeg trong Android nhưng cách tiếp cận 'wrapper' là một phương pháp mà tôi đã tìm thấy một sự pha trộn hợp lý về hiệu suất và dễ sử dụng. Một số ví dụ Android ffmpeg wrapper:

Nó có giá trị nhận thức được rằng đây sẽ là tốn nhiều thời gian trên di động - nếu bạn có sự sang trọng của việc có thể tải lên một máy chủ và thực hiện việc đảo ngược ở đó có thể nhanh hơn.

+0

Trước đây tôi đã sử dụng sự phụ thuộc này 'biên dịch' com.github.hiteshsondhi88.libffmpeg: FFmpegAndroid: 0.2.5'' để chà video .. tôi có nên tiếp tục với sự phụ thuộc này để đảo ngược video không? –

+0

Về lý thuyết với cách tiếp cận bao bọc, nếu một lệnh hoạt động thì mọi lệnh sẽ hoạt động, nhưng đáng lưu ý rằng ffmpeg không thực sự được thiết kế để được bọc như thế này nên tôi không nghĩ rằng bạn có thể chắc chắn 100% mà không cần thử nghiệm. Nếu nó làm việc cho bạn cho chà tôi sẽ bắt đầu có anyway như có một xác suất rất tốt nó sẽ làm việc cho điều này cũng có. Một điều cần lưu ý - nếu bạn cần âm thanh cũng bị đảo ngược (vì lý do nào đó ...) thì cách tiếp cận trên sử dụng 'sox' là một tiện ích riêng biệt. Các liên kết người giám hộ ở trên bao gồm sox mặc dù tôi đã không sử dụng nó cá nhân. – Mick

+0

thanks..Làm cách nào để tích hợp tiện ích sox trong dự án Android của tôi? –