Làm cách nào để tạo tệp video MPEG2 với chất lượng cao nhất có thể bằng FFMPEG?


16

Tôi đã có tệp WMV (v9 (WMV3), 960x720, 30.000030 khung hình / giây, phẳng 4: 2: 0 YUV, do PowerPoint 2010 sản xuất) và cần chuyển đổi sang MPEG2 - định dạng duy nhất mà TVset của tôi có thể đọc được từ ổ flash USB (Tôi cũng đã thử MP4 / h.264, AVI / XVID - không có gì ngoài MPEG2 hoạt động).

Tôi đã quản lý để công việc đơn giản

ffmpeg -i "in.wmv" -c:v mpeg2video "out.mpg"

nhưng chất lượng của kết quả là khủng khiếp (biến dạng hình ảnh rõ ràng được giới thiệu) và phát lại không được mượt mà (quá chậm tại một số thời điểm).

Tôi cũng đã thử

ffmpeg -i "in.wmv" -c:v mpeg2video -pix_fmt yuv420p -me_method epzs -threads 4 -r 30.000030 -g 45 -bf 2 -trellis 2 -cmp 2 -subcmp 2 -s 960x720 -b 2500k -bt 300k -async 1 -y "out.mpg"

.

Tôi phải sử dụng thông số nào để tiết kiệm chất lượng nhất có thể? Tỷ lệ nén hoàn toàn không thành vấn đề, thậm chí tăng kích thước tệp là chấp nhận được.

Điều Anther tôi thực sự cần (tôi đã chọn không đưa nó vào tiêu đề câu hỏi để tránh làm cho nó quá cụ thể nhưng tôi đánh giá cao nó được xem xét trong các câu trả lời) là thêm sự im lặng thuần túy như một bản nhạc âm thanh - không có âm thanh trong nguyên bản nhưng TV phàn nàn về điều đó và tôi muốn thoát khỏi sự phàn nàn này. Tôi đã tạo một tệp OGG Vorbis im lặng (chính xác thứ hai) bằng Audacity nhưng tôi không thể quản lý để hợp nhất nó với video:

ffmpeg -i in.mpg -i silence.ogg -c:v copy -c:a libmp3lame out.mpg

và thậm chí trần

ffmpeg -i in.mpg -c:v copy -out.mpg

đưa ra lỗi "tràn bộ đệm" và "gói quá lớn". (in.mpg là các tệp được tạo bởi cùng một tệp nhị phân FFMPEG và cùng tệp WMV nguồn sử dụng hai lệnh đầu tiên trong câu hỏi).

Tôi đang sử dụng bản dựng Zeranoe FFMPEG trên Windows 7.


2
Ai đó sẽ yêu cầu bạn cho một bản ghi đầu ra đầy đủ.
dstob

TV nào chính xác? Nó có thể đọc được H.264, chỉ là một hồ sơ khác.
slhck

@slhck TV được đặt Philips 42PFL3606H/58, tôi mã hóa thành H.264 với ffmpeg -i "in.wmv" -sws_flags lanczos+accurate_rnd -c:v libx264 -crf 20 -preset slow -profile:v baseline -level 3.0 -pix_fmt yuv420p -tune fastdecode -x264-params keyint=240:min-keyint=20 "out.mp4"- cấu hình là mức thấp nhất tôi biết và thậm chí nhiều tinh chỉnh được sử dụng để giúp phát tệp kết quả trở thành một nhiệm vụ dễ dàng hơn.
Ivan

1
Theo hướng dẫn, TV hỗ trợ MPEG-4 Visual và H.264. Nếu hồ sơ cơ sở không hoạt động, tôi không chắc chắn những gì. Nhưng TV rất kén chọn.
slhck

Câu trả lời:


16

Vấn đề là tốc độ bit mặc định cho MPEG-2 khá thấp (như với hầu hết các bộ mã hóa video khác trong ffmpeg, H.264 là một ngoại lệ). MPEG-2 cũng không phải là sự lựa chọn tốt nhất như một codec ngày nay.

Chất lượng tốt hơn cho MPEG-2

Bạn có một vài tùy chọn nếu bạn muốn gắn bó với MPEG-2:

  • Tăng tốc độ bit. Bạn đang sử dụng -b:v 2500k. Nếu là video HD, bạn sẽ không đi xa chỉ với 2,5 MBit / giây. Bạn cần ít nhất gấp đôi hoặc thậm chí nhiều hơn để làm cho kết quả tốt. Ví dụ, sử dụng -b:v 6000k -target pal-dvd.

    Đối với 720p, tôi nghĩ rằng bạn vẫn nên sử dụng tốc độ bit cao hơn. Hãy nhớ rằng DVD sử dụng MPEG-2 và có dung lượng khoảng 4,7 GB cho 2 giờ phim, do đó, bạn kết thúc với khoảng 5 Tim8 MBit / s. MPEG-2 thực sự không hiệu quả nén và hoạt động tốt hơn ở tốc độ bit cao hơn.

  • Sử dụng một cài đặt chất lượng cụ thể. Thay đổi -b:v …thành -qscale:v 2. Con số ở đây dao động từ 1 đến 31 và cao hơn có nghĩa là chất lượng thấp hơn. Không có điểm nào vượt quá 4 hoặc 5. Nếu bạn không quan tâm đến bitrate bắt đầu bằng 2 và xem điều đó có hiệu quả với bạn không.

Lộn xộn với số lượng khung hình B, phương pháp ước tính chuyển động hoặc kích thước GOP có thể điều chỉnh chất lượng một chút nhưng sẽ không dẫn đến những thay đổi lớn.

Âm thanh im lặng

Sử dụng -f lavfi -i aevalsrc=0để tạo ra một luồng âm thanh im lặng. Ví dụ:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"

Bạn có thể cần thêm -target pal-dvdvào lệnh trên để buộc một kích thước bộ đệm nhất định.

Tôi đã chọn MP3 làm codec. Các tệp MPEG không thể chứa âm thanh ngoài âm thanh MPEG Lớp I và II cũng như các luồng PCM, do đó, sử dụng tệp Ogg Vorbis im lặng sẽ không hoạt động trừ khi bạn chuyển đổi luồng âm thanh (không phải là những gì bạn đang làm khi bạn sử dụng -c:a copy) .

Sử dụng một codec video khác

Tôi ngạc nhiên rằng một TV phát các tệp video sẽ đọc MPEG-2 chứ không phải bất cứ thứ gì khác. Ít nhất phải hỗ trợ video MPEG-4 Phần II (đó là những gì bạn biết là "DivX" - bộ mã hóa MPEG-4 Phần II). Vì vậy, bạn có thể thử:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4"

TV của bạn thực sự cũng có thể hỗ trợ H.264, nhưng chỉ một cấu hình nhất định. Hãy thử sử dụng baselinehồ sơ, ví dụ:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libx264 -profile:v baseline -crf 23 -c:a aac -strict experimental "out.mp4"

Trong ví dụ trên, tôi đã sử dụng tùy chọn CRF để đặt chất lượng thay vì qscale. Xem hướng dẫn mã hóa H.264 để biết thêm.


"Lộn xộn với số lượng khung hình B, phương pháp ước tính chuyển động hoặc kích thước GOP có thể điều chỉnh chất lượng một chút nhưng sẽ không dẫn đến những thay đổi lớn." - tôi có thể biến mọi khung hình thành khung B và không sử dụng ước tính chuyển động với MPEG2 không? Video có rất nhiều phần năng động RẤT.
Ivan

Tôi đã thử dòng lệnh đầu tiên mà bạn đề xuất ( ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4") - nó mã hóa khoảng 100 khung hình và sau đó bắt đầu làm ngập màn hình với các lỗi như [mpeg @ 02f69ba0] buffer underflow i=0 bufi=235538 size=239761[mpeg @ 02f69ba0] packet too large, ignoring buffer limits to mux it.
Ivan

@Ivan Bạn thay đổi bitrate với -b:v. Đã thêm nó vào câu trả lời của tôi. Về cài đặt bộ mã hóa: Bạn không thể biến mọi khung hình thành khung B. Ngoài ra, bạn cần ước tính chuyển động - phương pháp càng kỹ càng, nén càng tốt. Nhưng nếu đó là một video động, điều đầu tiên bạn muốn là tăng tốc độ bit đáng kể. Các cài đặt mã hóa thực sự không có nhiều ảnh hưởng. Đối với lỗi của bạn, bạn có chắc đây là lỗi của lệnh đúng không? Một [mpeg]lỗi chỉ có thể xảy ra nếu tệp đầu ra của bạn .mpg, không phải khi nó .mp4.
slhck

Tôi đã sao chép = dán một phần sai, @slhck, tôi đang sử dụng ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"tất nhiên.
Ivan

1
-target pal-dvdgiải quyết vấn đề, không -bufsizehiệu quả (tôi đã thử -b:v 7M -bufsize 7M -maxrate 7M).
Ivan

0

Tôi sẽ ngay lập tức nói rằng nếu kích thước tệp không thực sự quan trọng thì chỉ cần thử nghiệm tăng tốc độ bit.

Đối với âm thanh im lặng bạn có thể chỉ muốn sử dụng ffmpeg, tôi không biết đủ về Audacity để đưa ra bất kỳ loại nhận xét nào. Tôi đã sử dụng điều này trước đây.

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.aac

Điều này sẽ không hiệu quả với bạn mặc dù bạn đang sử dụng bộ chứa mpg nên bạn có thể muốn thử. (Bộ chứa mp3)

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.mp3

Nó dường như làm việc cho tôi.


Đặt thời lượng là không cần thiết, vì ffmpeg sẽ chỉ sử dụng bất cứ thứ gì cần thiết cho video.
slhck

Tôi giữ mọi thứ cho quá trình hai bước như Ivan đã làm. Nếu bạn bỏ thời lượng trong lệnh của tôi thì tôi không biết ffmpeg sẽ chạy trong bao lâu (có thể lâu hơn bạn muốn).
dstob
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.