Xoay video mp4 mà không cần mã hóa lại


76

Tôi đang tìm cách xoay video được quay bằng Nexus 4 trên hệ thống Debian Wheezy. Các video được quay ở chế độ dọc và tôi muốn xoay chúng sang chế độ ngang. Tốt hơn là xoay được điều khiển theo dòng lệnh.

Tôi đã tìm thấy một số câu hỏi trước đây gợi ý về một giải pháp tốt nhưng dường như tôi không thể xoay sở để làm cho nó hoạt động.

Để bắt đầu, có câu hỏi này: Xoay video bằng FFmpeg

Nhưng nó chỉ ra rằng ffmpeg đã lỗi thời và tôi nên sử dụng avconv. Tôi đã tìm thấy câu hỏi này nêu chi tiết về con đường tiếp tục. /ubuntu/269429/how-can-i-rotate-video-by-180-degrees-with-avconv

Điều này khiến tôi sử dụng lệnh sau:

avconv -i original.mp4 -vf "transpose=1" -codec:v libx264 -preset slow -crf 25 -codec:a copy flipped.mp4

Tuy nhiên, điều này rất chậm (thử nghiệm lần trước khiến tôi mất hơn 6 giờ với ít hơn 3 phút cảnh quay) và không dẫn đến một bộ phim có thể phát được. Tôi cũng gặp lỗi trong đầu ra ghi nhật ký cho biết Mb Rate> giới hạn mức.

Có vấn đề ở đây với mã hóa lại không? Trước tiên, tôi có nên mã hóa lại video từ điện thoại của mình sang một mã hóa khác "khả thi" hơn trước khi áp dụng các cách quay không? Hay tôi đang bỏ lỡ một điểm quan trọng khác?


5
ffmpegtừ FFmpeg không phải là lỗi thời. Hàng giả, hàng nhái ffmpegtừ Libav (một nhánh của FFmpeg) là thứ đã lỗi thời. Bạn không thể xoay mà không mã hóa lại trừ khi: 1) đầu vào của bạn là MJPEG, hoặc 2) bạn xoay khi phát lại.
llogan

@LordNeckbeard Làm cách nào để phân biệt sự khác biệt? Tôi đã sử dụng trình quản lý gói để cài đặt ffmpeg vì vậy tôi đoán mình có đúng không?
stedes


Câu trả lời:


113

Nếu bạn chỉ muốn thay đổi siêu dữ liệu để người trung gian coi cờ phát tệp được xoay vòng, hãy thử một vài thao tác như:

ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=90 output.mp4

như được tìm thấy ở những nơi khác trên stackoverflow .


Tôi đã thử điều này nhưng không thành công. Tôi đang sử dụng mplayer trên Lubuntu. Vì vậy, làm thế nào để đọc siêu dữ liệu để kiểm tra xem nó có bị thay đổi hay không?
Sigur

3
@Sigur thử ffprobe -v quiet output.mp4 -show_streams|grep rot. Trên một video mà xoay được áp dụng thành công, tôi thấy kết quả này:TAG:rotate=90 rotation=-90
KWC

2
Có bất kỳ giải thích về các tham số? Ví dụ. Tôi đã tìm thấy một câu trả lời mà phần :0sau -metadatakhông có - cái này làm được gì? Để làm gì -c copy? ..
Dennis98

9
Ok, tôi chỉ gặp lại câu hỏi này nhưng giờ đã có nhiều kinh nghiệm hơn với FFmpeg. Sau :s:v:0đó -metadatalà công cụ chỉ định luồng, chỉ cho ffmpeg biết luồng nào nó sẽ thêm siêu dữ liệu. :schỉ là viết tắt của các luồng của tệp đầu vào, :vchọn luồng video và số là chỉ số luồng, dựa trên số không - vì vậy, điều này sẽ chỉ chọn luồng video đầu tiên. Vì bạn thường không có nhiều luồng video, :s:vnên kết quả sẽ giống nhau. Các -cquy định cụ thể tùy chọn các codec được sử dụng, với copychỉ sao chép các con suối, mà không cần mã hóa lại.
Dennis98

2
Không phải tất cả người chơi sẽ hỗ trợ này
Hamid Reza

51

Rotation = 0 đã khắc phục sự cố của tôi. Tôi bắt đầu quay video ở chế độ dọc, nhận ra sai lầm của mình và ngay lập tức xoay điện thoại sang chế độ ngang để tiếp tục quay. IPhone của tôi đã đánh dấu video là dọc cho toàn bộ video.

ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=0 output.mp4

Đã sửa nó.


8
Bạn có thể giải thích thêm thông số này được không?
Zulu

33

FFmpegvà các chương trình tương tự thay đổi siêu dữ liệu ngay cả với -map_metadatatùy chọn. exiftoolcó thể đọc ma trận xoay và cờ xoay, và kể từ phiên bản 10.89 cũng viết nó như mô tả bên dưới.

Để có được vòng quay không mất dữ liệu (bao gồm siêu dữ liệu) thực sự, tôi không thể tìm ra giải pháp, vì vậy tôi đã lấy một trình chỉnh sửa hex (ví dụ: HxD ) và phân tích các tệp video đã xoay.

Quay MP4 không mất dữ liệu thực:

  • mở mp4 bằng trình chỉnh sửa hex và tìm kiếm videđể tìm siêu dữ liệu của đoạn video
  • một số hàng ở trên (đối với tệp của tôi chủ yếu là 9, đôi khi là 12) bạn sẽ thấy trak...\tkhd
  • ở giữa phải có một @dấu hiệu (HEX 40)
  • trong hai hàng trước nó, ma trận xoay được lưu trữ
  • không xoay:

    00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    40
    
  • 180 °:

    FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    40
    
  • 90 ° cw:

    00 00 00 00 00 01 00 00 00 00 00 00 FF FF 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    40 
    
  • 90 ° ccw:

    00 00 00 00 FF FF 00 00 00 00 00 00 00 01 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    40
    

Thay đổi tệp khi bạn cần và nó phải được xoay trong các trình phát hỗ trợ cờ xoay (hầu hết các trình phát hiện tại đều làm như vậy).

Trong trường hợp video của bạn chứa âm thanh nổi, điều này rõ ràng là không được chuyển đổi, vì vậy trong trường hợp bạn muốn âm thanh khớp với tính năng xoay video (180 °), bạn cần chuyển kênh trái và phải.


5
Tôi không thể hiểu làm thế nào mà điều này lại không nhận được bất kỳ sự ủng hộ nào. Các câu trả lời khác đưa ra lời nói dối rằng bạn không thể quay video một cách dễ dàng trừ khi đó là MJPEG. Điều này phù hợp với tôi, nó không mất dữ liệu, không cần mã hóa lại (tức thì) và tôi đảm bảo rằng không có gì khác trong tệp bị thay đổi và tôi không phải gặp rắc rối với việc tải xuống các tệp nhị phân thực thi ngẫu nhiên ngoài mạng. Điều này thậm chí còn nhanh hơn thiết lập một dòng lệnh từ câu trả lời được chấp nhận. Có một ủng hộ và cảm ơn! :)
deLock

1
Cám ơn. Tôi đoán đó là vấn đề tìm ra giải pháp tốt hơn cho một câu hỏi cũ có nhiều câu trả lời ở đây trên SX. Thực tế có nhiều chủ đề tương tự, tôi đã cố gắng trả lời / trợ giúp thông tin này, nhưng đã bị chặn từ những người dùng khác phức tạp hơn. Tuy nhiên, cần thảo luận thêm về meta SX.
aXeL-HH

1
Chỉ cần thử nó. Xinh đẹp. Nó chỉ mất vài giây, hoạt động hoàn hảo và có thể hoàn nguyên 100% về tệp gốc. Cảm ơn bạn!
Spire

1
@ user3469861 Mã được tích hợp vào ExifTool v10.89, bạn có thể chỉ muốn sử dụng: u88.n24.queensu.ca/exiftool/forum/index.php/...
Axel-HH

1
Tôi cũng đã nướng phương pháp này thành một công cụ độc lập .
AndreKR

2

Có một số điều bạn đã đề cập trong câu hỏi của mình:

  1. Hầu như không có cơ hội để bạn có thể xoay mà không cần mã hóa lại. Ngoại lệ cho quy tắc đó (codec MJPEG) đã được chỉ ra, nhưng không chắc bạn đang sử dụng nó, vì vậy nó vượt ra ngoài phạm vi của câu hỏi này. Tôi sẽ đề cập rằng lý do cho khả năng này là JPEG có thể được chuyển đổi thông qua siêu dữ liệu. Do đó, nếu bạn có thể tìm thấy vùng chứa có xoay siêu dữ liệu, bạn sẽ có thể xoay, nhưng không có vùng chứa nào tồn tại (hoặc đủ rộng) cho đến nay.
  2. Nếu bạn mất hàng giờ để xoay và viết lại mã 3 phút của video, thì vấn đề có thể nằm ở độ phân giải quá lớn . Và ý tôi là rất lớn ! Bạn có thể vui lòng cung cấp đầu ra của avprobe original.mp4để nó có thể được xác định.
  3. Các cuộc tranh luận giữa Libav và FFmpeg rất phản tác dụng (bạn có thể thấy điều đó bằng lượng fud được đăng ở đây). Về cơ bản những gì đã xảy ra là sự chia tách dự án với một số nhà phát triển đi theo cách này và cách khác, thực tế là dự án FFmpeg đã quản lý để giữ tên chỉ là một trò may rủi và không có ý nghĩa gì khi gọi một dự án gốc và một dự án khác là một ngã ba. Sự khác biệt giữa các dự án chủ yếu nằm ở phong cách phát triển và triết lý. Nếu bạn mô tả FFmpeg là Mã nguồn mở nhiều hơn và Libav là Phần mềm miễn phí hơn, bạn sẽ không nhầm lẫn như vậy. Những người có lý trí hy vọng rằng cuối cùng các nhà phát triển sẽ hiểu ra và có thể không hợp nhất các dự án, nhưng hợp tác ở mức độ lớn hơn. Khi Ubuntu ra mắt ban đầu, trên mỗi cuộc trò chuyện Debian GNU / Linux, có rất nhiều thông báo dọc theo dòng "

3
JPEG cũng có thể được xoay một cách dễ dàng mà không cần thay đổi siêu dữ liệu
Walter Tross

@WalterTross Như tôi hiểu quá trình chỉ có thể được thực hiện nếu độ phân giải chia hết cho kích thước khối, nếu không, thì chỉ bằng cách thay đổi EXIF, bạn mới có thể thực hiện điều này một cách thực sự dễ dàng. Nêu tôi sai vui long chân chỉnh tôi.
v010dya

2

Câu trả lời này chỉ đơn giản là một bản tóm tắt các ý kiến ​​được cung cấp bởi LordNeckbeard.

Xoay mà không cần mã hóa

Không thể xoay mà không mã hóa lại trừ khi:

  • đầu vào của bạn là MJPEG
  • bạn xoay khi phát lại

Xoay vòng với mã hóa bằng cách sử dụng ffmpeg chính xác

Để hiểu đúng các bước cần thiết cho việc này, bạn nên bắt đầu bằng cách đọc hoặc ít nhất là đọc lướt câu hỏi này:

Sự khác biệt và giống nhau giữa ffmpeg, libav và avconv là gì?

Tóm tắt: avconv là một nhánh của ffmpeg, người bảo trì debian đã chọn avconv, bạn phải biên dịch ffmpeg chính xác từ nguồn.

Bước tiếp theo sẽ là biên dịch ffmpeg chính xác từ nguồn như được trình bày chi tiết ở đây:

Hướng dẫn biên dịch của ffmpeg cho Debian

Bước cuối cùng là sử dụng các lệnh tìm thấy trong các bài viết khác:

Làm thế nào để lật video 180 ° (dọc / lộn ngược) với FFmpeg? hoặc Xoay video bằng FFmpeg

Tóm tắt: ffmpeg -vfilters "xoay = 90" -i input.mp4 output.mp4

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.