Batch chuyển đổi H.265 mkv thành H.264 với ffmpeg để làm cho các tệp tương thích để mã hóa lại


31

Tôi có các tệp được mã hóa H.265 rất tốn tài nguyên, chúng không chơi tốt và phần mềm chuyển đổi của tôi (mencoder) không (hiện tại) hỗ trợ định dạng H.265. Tôi có thể chuyển đổi chúng thành H.264 trong tệp bó dòng lệnh để nhanh chóng chuyển đổi các tệp để nén lại bằng Devede / OGMrip không? Khi tìm kiếm trang web này tôi không tìm thấy nó thảo luận vì vậy tôi sẽ đăng những gì tôi cảm thấy là một câu hỏi và câu trả lời hữu ích cho câu hỏi.

Câu trả lời:


37

Có, sử dụng ffmpeg.

Mở một thiết bị đầu cuối và hướng nó đến thư mục chứa các tệp được mã hóa H.265, giả sử bạn có ffmpegvà các thư viện thích hợp được cài đặt và giả sử chúng ở định dạng MKV sao chép và dán đoạn sau vào cửa sổ đầu cuối.

INPUT="$1"
for i in *.mkv ; do
    ffmpeg -i "$i" -bsf:v h264_mp4toannexb -sn -map 0:0 -map 0:1 -vcodec libx264 "$i.ts"
    mv "$i.ts" "$i.mpg"
    sleep 3
done

Có bạn có nó. Điều này sẽ chuyển đổi sang h.264 trong một thùng chứa MPG trong cùng thư mục.

Giải thích về các công tắc lệnh:

  • for i in *.mkv ; do ... done

    Điều này thiết lập tất cả các tệp .mkv trong một thư mục được bao gồm trong quy trình lô. Điều này có thể được thay đổi để phù hợp với phần mở rộng vùng chứa của các tệp bạn muốn xử lý.

  • ffmpeg -i "$i" Thực thi chương trình ffmpeg và gọi các tệp được xử lý.

    • -bsf:v kích hoạt bộ lọc luồng video được sử dụng.

    • h264_mp4toannexb - Là bộ lọc luồng bit được kích hoạt.

      Chuyển đổi một dòng bit H.264 từ chế độ tiền tố chiều dài để bắt đầu chế độ tiền tố mã (như được định nghĩa trong Phụ lục B của đặc tả ITU-T H.264).

      Điều này được yêu cầu bởi một số định dạng phát trực tuyến, điển hình là định dạng luồng truyền tải MPEG-2 ( mpegts) đang xử lý MKV h.264 (hiện tại) yêu cầu điều này, nếu không được bao gồm, bạn sẽ gặp lỗi trong cửa sổ đầu cuối hướng dẫn bạn sử dụng.

    • -sn dừng phát trực tuyến các luồng phụ đề (đối với những luồng không muốn phụ đề trong video của họ) Đây là tùy chọn và có thể được xóa.

    • -map 0:0 -map 0:1Yêu cầu ffmpeg chỉ xử lý hai luồng đầu tiên của tệp ( 0:0là luồng video, 0:1là luồng âm thanh đầu tiên của tệp). Điều này thực hiện hai điều, loại bỏ các luồng âm thanh dư thừa, thường là luồng âm thanh đầu tiên là tiếng Anh nhưng không phải lúc nào cũng vậy. Các luồng khác như phụ đề nhúng được loại bỏ làm giảm kích thước tệp. Đây cũng là một chuỗi tùy chọn. Bạn có thể sử dụng ffprobeđể xem các luồng có sẵn trong tệp. -maplà tùy chọn và có thể được loại bỏ khỏi lệnh.

    • -vcodec libx264 Điều này bảo ffmpeg mã hóa đầu ra thành H.264

    • "$i.ts" Lưu đầu ra thành định dạng .ts, điều này rất hữu ích để không ghi đè lên các tệp nguồn của bạn.

  • mv "$i.ts" "$i.mpg"Chuyển đổi phần mở rộng tập tin thành MPG trong cùng thư mục. Điều này có thể được thiết lập để gửi nó đến bất kỳ thư mục nào bạn muốn.

  • sleep 3 - cho phép quá trình nghỉ ngơi cho thời gian ffmpeg để xếp hàng tệp tiếp theo


3
Xuất sắc! Bây giờ chúng ta có thể xóa các bình luận bên dưới câu hỏi. Tôi muốn nói rằng điều sleep 3này là không cần thiết (nhưng có thể hữu ích để chấm dứt vòng lặp) và INPUT=$1vô nghĩa vì bạn đang chạy nó trực tiếp trong một vỏ tương tác.
muru

11
Xem xét việc sao chép luồng âm thanh -c:a copythay vì mã hóa lại. Ngoài ra, 0:0có thể không phải lúc nào cũng đề cập đến video và 0:1có thể không phải lúc nào cũng đề cập đến âm thanh. Bạn có thể sử dụng trình xác định luồng để tránh các sự cố tiềm ẩn: -map 0:v -map 0:anếu bạn muốn tất cả các luồng video và âm thanh từ đầu vào 0 hoặc -map 0:v:0 -map 0:a:0nếu bạn chỉ muốn các luồng video và âm thanh đầu tiên từ đầu vào 0. Nếu bạn chỉ muốn luồng âm thanh tiếng Anh: -map 0:m:language:eng(giả sử nó được dán nhãn).
llogan

1
@LordNeckbeard Tôi sẽ bình chọn cho bạn để viết một câu trả lời hoàn chỉnh.
Fran Marzoa

1
@Fran Không nhận thấy có rất nhiều ý kiến ​​trái chiều về nhận xét đó. Tôi đã thêm một câu trả lời bằng các phương pháp đơn giản hơn, ít lỗi hơn và hiệu quả hơn.
llogan

1
Tôi hoàn toàn đi với đơn giản ffmpeg -i $INPUT -vcodec h264 -acodec copy $OUTPUT. Một cái gì đó tôi sử dụng hàng ngày và thực sự có thể ghi nhớ trái ngược với hàng loạt những lá cờ vô nghĩa mà mọi câu trả lời của ffmpeg đều rất khét tiếng.
Ben Sinclair

20

Chuyển đổi hàng loạt H.265 sang H.264

Những ví dụ này đã được viết cho gần đây ffmpeg. Tự cứu mình một số rắc rối và tải về một phiên bản gần đây. Sau đó đặt ffmpegnhị phân vào ~/binhoặc /usr/local/bin(bạn có thể phải đăng xuất sau đó đăng nhập để được chú ý).

Đầu ra Matroska

mkdir h264vids
for f in *.mp4; do ffmpeg -i "$f" -map 0 -c copy -c:v libx264 -crf 23 -preset medium h264vids/"${f%.*}.mkv"; done
  • Ví dụ này sẽ xuất ra một thư mục có tên h264vids.

  • Ví dụ này giả định đầu vào của bạn là .mp4. Nếu không, hãy thay đổi .mp4thể hiện trong ví dụ thành loại tệp đầu vào của bạn hoặc chỉ sử dụng *chính nó.

  • Điều chỉnh -crfchất lượng và -presettốc độ / hiệu quả mã hóa. Hoặc chỉ cần loại bỏ các tùy chọn này và sử dụng các giá trị mặc định khá tốt và đủ cho hầu hết (ví dụ này là sử dụng các giá trị mặc định cho các tùy chọn này). Xem FFmpeg Wiki: H.264 để biết thêm thông tin về các tùy chọn này.

Đầu ra MP4

Cái này phức tạp hơn một chút. Điều này sẽ thực hiện mã hóa có điều kiện tùy thuộc vào âm thanh đầu vào có phải là AAC hay không. Nếu âm thanh đầu vào là AAC thì âm thanh sẽ được sao chép luồng (được trộn lại) như hiện tại và không cần mã hóa lại. Nếu âm thanh đầu vào không phải là AAC thì nó sẽ được mã hóa lại thành AAC.

Đây là một kịch bản đơn giản chỉ ra cách làm điều này bằng cách sử dụng ffprobeffmpeg. Sao chép và lưu nó vào thư mục chứa các video của bạn sẽ được chuyển đổi, cấp cho nó quyền thực thi chmod +x yourscriptname, sau đó chạy nó với ./yourscriptname.

#!/bin/bash

mkdir h264vids

for f in *.mkv
do
  audioformat=$(ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$f")
  if [ "$audioformat" = "aac" ]; then
    ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a copy -movflags +faststart h264vids/"${f%.*}.mp4"
  else
    ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a aac -movflags +faststart h264vids/"${f%.*}.mp4"
  fi
done
  • Ví dụ này sẽ xuất ra một thư mục có tên h264vids.

  • Ví dụ này giả định đầu vào của bạn là .mkv. Nếu không, hãy thay đổi .mkvthể hiện trong ví dụ thành loại tệp đầu vào của bạn hoặc chỉ sử dụng *chính nó.

  • Xem lưu ý ở trên liên quan -crf-preset.

  • Bạn có thể tạm dừng mã hóa bằng ctrl+ zvà tiếp tục với fg.


0

Xem xét các câu trả lời trước, tôi đã đưa ra những điều sau đây:

for file in *265.mkv; do nice -n19 ffmpeg -i $file -c copy -c:v libx264 ${file/%265.mkv/264.mkv}; done

Giả định này, rằng các tệp luôn có một tên kết thúc bằng 265.mkv. Kết thúc này sẽ được thay thế bằng 264.mkv.

Nếu đặt tên tệp của bạn là khác nhau, bạn cần điều chỉnh lệnh cho phù hợp.

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.