Cách tốt nhất để quay hàng loạt 3000+ h.264 video?


8

Tôi có khoảng 3000 video clip ngắn, thời lượng khoảng 3 giây. Tôi cần xoay mỗi người 90 độ. Cách tốt nhất để làm việc này là gì? Tôi có đăng ký Adobe Creative Cloud, cũng như quyền truy cập vào cả máy Windows và Mac. Tìm kiếm giải pháp đơn giản nhất để tự động hóa / xử lý hàng loạt quá trình quay của rất nhiều video.

Nếu bạn đang tự hỏi - các video là một phần của khóa học điện tử về gỗ. Người học xem từng video được chọn ngẫu nhiên, đây chỉ là một đoạn phim ngắn về một miếng gỗ xẻ đang quay. Các video được quay sao cho gỗ xẻ (2x4, v.v.) nằm ngang. Nhưng bây giờ khách hàng muốn gỗ xẻ thẳng đứng trong clip.


Chỉ quay? Từ ví dụ 1280x720 đến 720x1280 phải không?
p2or

Chỉ cần xoay 90 độ theo chiều kim đồng hồ (hoặc bộ đếm cw - không quan trọng đối với dự án này).
dùng172586

Liệu vùng chứa các tệp video của bạn có bao gồm siêu dữ liệu 'định hướng' không?
audionuma

Câu trả lời:


9

Sử dụng ffmpegbộ lọc "chuyển vị""nghèo" được đề xuất . Ví dụ: nếu các tệp của bạn là mp4 và nằm trong thư mục hiện tại:

mkdir -p rotated
for f in *.mp4; do ffmpeg -i "$f" -vf transpose=2 -c:a copy -metadata:s:v rotate="" rotated/"$f"; done
  • Giá trị chuyển vị có thể là "1" hoặc "đồng hồ" để quay theo chiều kim đồng hồ, "2" hoặc "cclock" để quay ngược chiều kim đồng hồ. Có những giá trị khác cũng sẽ áp dụng lật.

  • Âm thanh sẽ được sao chép luồng để tránh mã hóa lại không cần thiết.

  • Siêu dữ liệu xoay luồng video được xóa trong ví dụ này. Mặt khác ffmpegsẽ sao chép nó từ đầu vào sang đầu ra dẫn đến một vòng quay không chính xác cho những người chơi chú ý đến siêu dữ liệu này (một số làm và một số thì không).

Một ví dụ khác, dài dòng và linh hoạt hơn, và giữ cho tệp được xoay trong cùng thư mục có tên mới:

ext=mp4
for f in /some/dir/*.$ext; do
    new=${f/%.$ext/-rotated.$ext};
    ffmpeg -i "$f" -vf transpose=2 -c:a copy -metadata:s:v rotate="" "$new"
done

Đúng! Tôi nên tìm hiểu thêm về kịch bản bash :)
p2or

1

Bạn đã xác định rằng bạn quan tâm đến việc làm việc trên một số lượng lớn video, nếu bạn có một máy đa lõi và bạn sẽ sử dụng một forvòng lặp bình thường do vỏ của bạn cung cấp, bạn sẽ có một trong số các lõi của bạn chạy nóng, trong khi những người khác hoàn toàn không làm gì . Điều này không lý tưởng.

Những gì bạn nên làm cho một công việc như vậy đang sử dụng parallel, một công cụ cho phép bạn bắt đầu một số công việc cùng một lúc và nó có thể làm mọi thứ mà một vòng lặp for có thể, nhưng tốt hơn.

Tôi sẽ không viết về tất cả các tính năng của công cụ này, nhưng sẽ tập trung vào nhiệm vụ cụ thể của bạn.

Một cách để bắt đầu tất cả những công việc này là:

parallel avconv -i "{}" -vf transpose=2 "{.}[rotated].mp4" ::: *.mp4

Ở đây {}thay thế mỗi tên tệp và {.}thay thế tên tệp mà không có phần mở rộng.

Tôi sẽ đề nghị rằng bạn sẽ bắt đầu nhiều công việc như bạn có lõi, lấy đi một. Lý do là vì vậy hệ điều hành của bạn sẽ vẫn có thể sử dụng được và điều này cũng sẽ giúp bạn tiết kiệm trong trường hợp nếu bạn đang sử dụng mã hóa ổ cứng (sẽ sử dụng sức mạnh xử lý để đọc / ghi dữ liệu). Để làm điều này chỉ cần thêm --jobs -1vào dòng lệnh của bạn, và bạn sẽ giới hạn số lượng công việc.

parallel --jobs -1 avconv -i "{}" -vf transpose=2 "{.}[rotated].mp4" ::: *.mp4

Xin lưu ý rằng sẽ không có đầu ra nào được đưa ra cho đến khi mỗi mã hóa hoàn thành. Vì vậy, bạn sẽ không thấy bao nhiêu video của bạn được thực hiện.


1

Dựa trên câu trả lời này, bạn có thể sử dụng ffmpeg với các lệnh sau để xoay video:

ffmpeg -i input -vf transpose=2 output

Để xử lý hàng loạt một thư mục phim, bạn có thể sử dụng ngôn ngữ lập trình bạn chọn và lặp qua các tệp. Tôi đã sử dụng linux với python 2.7+ ở đây. Bạn chỉ phải chỉnh sửa folder_moviesđường dẫn path_to_ffmpegvà đặt phim của mình extension:

import os # import os module
import subprocess # import subprocess module

# set the path to your video folder
folder_movies = '/home/user/Desktop/test/'

# set ffmpeg path
path_to_ffmpeg = "/opt/ffmpeg/ffmpeg"

# set file extension
ext = ".mp4"

# collect all videos in folder_movies
movie_files = [f for f in os.listdir(folder_movies) if f.endswith(ext)] 

# iterate through the files
for i in movie_files:

    # setup correct filepath for mov's
    file_path = os.path.join(folder_movies,i)

    # generate new file path
    new_path = os.path.splitext(file_path)[0] + '_rotated_90' + ext

    # call ffmpeg with the correct arguments
    # command: ffmpeg -i input -vf transpose=2 output
    subprocess.call([path_to_ffmpeg, "-i",  file_path, "-vf", "transpose=2", "-c:a", "copy", new_path])

Sau đó, thư mục phim của bạn sẽ giống như:

nhập mô tả hình ảnh ở đây

Ưu điểm của việc sử dụng python là mã chạy đa nền tảng . Điều duy nhất bạn cần xem xét là các đường dẫn đến thư mục và tệp thực thi ffmpeg. Để chạy cái này trên máy tính windows, bạn chỉ phải thay thế các đường dẫn đến một cái gì đó như:

# folder_movies = '/home/user/Desktop/test/' # linux or osx
folder_movies = r'c:\some\directory\test'    # windows, the r is important
folder_movies = 'c:/some/directory\test'     # windows (alternative)

# path_to_ffmpeg = '/opt/ffmpeg/ffmpeg'            # linux or osx
path_to_ffmpeg = r'c:\Program Files\ffmpeg\ffmpeg' # windows, the r is important
path_to_ffmpeg = 'c:/Program Files/ffmpeg\ffmpeg'  # windows (alternative)

Lưu ý: Tôi không phải là chuyên gia ffmpeg, có thể có cách xử lý hàng loạt với nó trực tiếp.


1
Bạn không thực sự cần một toàn bộ kịch bản cho việc này. Nó có thể được thực hiện trực tiếp trên dòng lệnh Mac hoặc Linux với một cái gì đó như: mkdir -p rotated; for f in *.mp4; do ffmpeg -i "$f" -vf transpose=2 rotated/"$f"; done(giả sử các tệp video của bạn là .mp4 trong ví dụ này).
mivk

@mivk tốt, tại sao không chuyển đổi điều này thành một câu trả lời?
p2or

@mivk Vì bạn đang sử dụng vòng lặp for nên nó gần giống nhau. Đối với những người không sử dụng linux hoặc osx, nên sử dụng python hoặc ngôn ngữ script khác.
p2or

@poor: tốt, đối với những người dùng không phải trên linux cũng như trên mac, bản dịch sang PowerShell là "còn lại như một bài tập cho người đọc" ... :-)
mivk

@mivk hehe, ừ, nhưng không ai muốn sử dụng nó;)
p2or
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.