ชุดแปลง H.265 mkv เป็น H.264 ด้วย ffmpeg เพื่อให้ไฟล์เข้ากันได้สำหรับการเข้ารหัสอีกครั้ง


31

ฉันมีไฟล์ที่เข้ารหัส H.265 ซึ่งมีทรัพยากรจำนวนมากพวกเขาเล่นได้ไม่ดีและซอฟต์แวร์การแปลง (mencoder) ของฉันไม่ได้ (ปัจจุบัน) รองรับรูปแบบ H.265 ฉันสามารถแปลงเป็น H.264 ในไฟล์แบตช์บรรทัดคำสั่งเพื่อแปลงไฟล์สำหรับการบีบอัดใหม่โดยใช้ Devede / OGMrip ได้อย่างรวดเร็วหรือไม่? เมื่อค้นหาเว็บไซต์นี้ฉันไม่พบมันกล่าวถึงดังนั้นฉันจะโพสต์สิ่งที่ฉันรู้สึกว่าเป็นคำถามที่มีประโยชน์และตอบคำถาม

คำตอบ:


37

ffmpegใช่ใช้

เปิดเทอร์มินัลและนำไปยังไดเรกทอรีที่มีไฟล์ที่เข้ารหัส H.265 โดยสมมติว่าคุณมีffmpegและติดตั้งไลบรารีที่เหมาะสมและถือว่าอยู่ในรูปแบบ MKV คัดลอกและวางสิ่งต่อไปนี้ลงในหน้าต่างเทอร์มินัล

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

ที่นั่นคุณมีมัน สิ่งนี้จะแปลงเป็น h.264 ในคอนเทนเนอร์ MPG ในไดเรกทอรีเดียวกัน

คำอธิบายของสวิตช์คำสั่ง:

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

    สิ่งนี้จะตั้งค่าไฟล์. mkv ทั้งหมดในไดเรกทอรีที่จะรวมไว้ในกระบวนการแบทช์ สิ่งนี้อาจมีการเปลี่ยนแปลงเพื่อรองรับส่วนขยายคอนเทนเนอร์ของไฟล์ที่คุณต้องการดำเนินการ

  • ffmpeg -i "$i" รันโปรแกรม ffmpeg และเรียกใช้ไฟล์ที่จะประมวลผล

    • -bsf:v เปิดใช้งานตัวกรองสตรีมวิดีโอบิตที่จะใช้

    • h264_mp4toannexb - เป็นตัวกรองบิตสตรีมที่เปิดใช้งาน

      แปลง H.264 บิตสตรีมจากโหมดนำหน้าความยาวเป็นโหมดเริ่มต้นโค้ดนำหน้า (ตามที่กำหนดในภาคผนวก B ของข้อมูลจำเพาะ ITU-T H.264)

      จำเป็นต้องใช้รูปแบบการสตรีมบางรูปแบบโดยทั่วไปแล้วรูปแบบการส่งผ่าน MPEG-2 ( mpegts) การประมวลผล MKV h.264 (ปัจจุบัน) จำเป็นต้องใช้สิ่งนี้หากไม่ได้รวมอยู่คุณจะได้รับข้อผิดพลาดในหน้าต่างเทอร์มินัล

    • -sn หยุดการสตรีมของสตรีมคำบรรยาย (สำหรับผู้ที่ไม่ต้องการคำบรรยายในวิดีโอ) นี่เป็นตัวเลือกและสามารถลบออกได้

    • -map 0:0 -map 0:1บอก ffmpeg ให้ประมวลผลสตรีมสองไฟล์แรกเท่านั้น ( 0:0คือสตรีมวิดีโอ0:1เป็นสตรีมเสียงแรกของไฟล์) การทำสองสิ่งนี้จะแยกการสตรีมเสียงส่วนเกินโดยปกติแล้วการสตรีมเสียงครั้งแรกจะเป็นภาษาอังกฤษ แต่ไม่เสมอไป สตรีมอื่น ๆ เช่นคำบรรยายในตัวจะถูกลบออกเพื่อลดขนาดไฟล์ นี่เป็นสตริงที่เป็นทางเลือกด้วย คุณสามารถใช้ffprobeเพื่อดูสตรีมที่มีอยู่ในไฟล์ -mapเป็นทางเลือกและสามารถละทิ้งได้จากคำสั่ง

    • -vcodec libx264 สิ่งนี้บอก ffmpeg ให้เข้ารหัสเอาต์พุตเป็น H.264

    • "$i.ts" บันทึกเอาต์พุตเป็นรูปแบบ. ts ซึ่งมีประโยชน์เพื่อไม่ให้เขียนทับไฟล์ต้นฉบับของคุณ

  • mv "$i.ts" "$i.mpg"แปลงนามสกุลไฟล์เป็น MPG ในไดเรกทอรีเดียวกัน สามารถตั้งค่าให้ส่งไปยังไดเรกทอรีใดก็ได้ที่คุณต้องการ

  • sleep 3 - อนุญาตให้กระบวนการพักให้เวลา ffmpeg เพื่อรอคิวไฟล์ถัดไป


3
ยอดเยี่ยม ตอนนี้เราสามารถลบความคิดเห็นใต้คำถาม ฉันจะบอกว่าsleep 3ไม่จำเป็น (แต่เป็นไปได้มีประโยชน์สำหรับการยกเลิกการวนรอบ) และINPUT=$1ไม่มีความหมายเนื่องจากคุณใช้งานโดยตรงในเชลล์แบบโต้ตอบ
muru

11
พิจารณาสตรีมการคัดลอกเสียงด้วย-c:a copyแทนที่จะเข้ารหัสใหม่ นอกจากนี้0:0อาจไม่ได้อ้างถึงวิดีโอเสมอไปและ0:1อาจไม่อ้างอิงถึงเสียงเสมอไป คุณสามารถใช้ตัวระบุกระแสข้อมูลเพื่อหลีกเลี่ยงปัญหาที่อาจเกิดขึ้น: -map 0:v -map 0:aหากคุณต้องการกระแสข้อมูลวิดีโอและเสียงทั้งหมดจากอินพุต 0 หรือ-map 0:v:0 -map 0:a:0ถ้าคุณต้องการกระแสข้อมูลวิดีโอและเสียงแรกจากอินพุต 0 หากคุณต้องการกระแสข้อมูลเสียงภาษาอังกฤษเท่านั้น: -map 0:m:language:eng(สมมติว่าเป็น มีป้ายกำกับ)
llogan

1
@LordNeckbeard ฉันจะโหวตให้คุณเขียนคำตอบที่สมบูรณ์
Fran Marzoa

1
@Fran ไม่ได้สังเกตว่ามี upvotes มากมายในความคิดเห็นนั้น ฉันเพิ่มคำตอบโดยใช้วิธีที่ง่ายกว่าข้อผิดพลาดน้อยลงและวิธีการที่มีประสิทธิภาพมากขึ้น
llogan

1
ffmpeg -i $INPUT -vcodec h264 -acodec copy $OUTPUTฉันทั้งหมดไปกับเพียง สิ่งที่ฉันใช้ทุกวันและสามารถจดจำได้จริงเมื่อเทียบกับการโจมตีของธงที่ไม่มีความหมายซึ่งคำตอบ ffmpeg ทุกคำนั้นน่าอับอายมาก
Ben Sinclair

20

การแปลงแบตช์เป็น H.265 ถึง H.264

ตัวอย่างเหล่านี้เขียนขึ้นเมื่อไม่นานมาffmpegนี้ ช่วยตัวเองให้ยุ่งยากและดาวน์โหลดเวอร์ชันล่าสุด จากนั้นใส่ffmpegไบนารี่ใน~/binหรือ/usr/local/bin(คุณอาจต้องออกจากระบบแล้วลงชื่อเข้าใช้เพื่อให้สังเกตได้)

เอาต์พุต 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
  • h264vidsตัวอย่างนี้ออกจะยังไดเรกทอรีที่มีชื่อว่า

  • .mp4ตัวอย่างนี้อนุมานปัจจัยการผลิตของคุณ ถ้าไม่เปลี่ยน.mp4อินสแตนซ์ในตัวอย่างเป็นประเภทไฟล์อินพุตของคุณหรือเพียงแค่ใช้โลภ*ด้วยตัวเอง

  • ปรับ-crfเพื่อคุณภาพและ-presetเข้ารหัสความเร็ว / ประสิทธิภาพ หรือเพียงแค่ลบตัวเลือกเหล่านี้ออกและใช้ค่าเริ่มต้นที่ค่อนข้างดีและน่าจะพอเพียง (ตัวอย่างคือการใช้ค่าเริ่มต้นสำหรับตัวเลือกเหล่านี้) ดูFFmpeg Wiki: H.264สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกเหล่านี้

เอาต์พุต MP4

อันนี้ซับซ้อนกว่าเล็กน้อย สิ่งนี้จะทำการเข้ารหัสตามเงื่อนไขขึ้นอยู่กับว่าสัญญาณเสียงเข้าเป็น AAC หรือไม่ หากอินพุตเสียงเป็น AAC เสียงจะถูกคัดลอก (รีเฟรช) อีกครั้งตามที่เป็นอยู่และหลีกเลี่ยงการเข้ารหัสซ้ำที่ไม่จำเป็น หากสัญญาณเสียงเข้าไม่ใช่ AAC จะมีการเข้ารหัสเป็น AAC อีกครั้ง

นี่คือสคริปต์ง่ายแสดงให้เห็นถึงวิธีการทำเช่นนี้โดยใช้และffprobe ffmpegคัดลอกและบันทึกลงในไดเรกทอรีที่มีวิดีโอของคุณจะแปลงให้ผู้ได้รับอนุญาตด้วยแล้วเรียกมันด้วยchmod +x yourscriptname./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
  • h264vidsตัวอย่างนี้ออกจะยังไดเรกทอรีที่มีชื่อว่า

  • .mkvตัวอย่างนี้อนุมานปัจจัยการผลิตของคุณ ถ้าไม่เปลี่ยน.mkvอินสแตนซ์ในตัวอย่างเป็นประเภทไฟล์อินพุตของคุณหรือเพียงแค่ใช้โลภ*ด้วยตัวเอง

  • ดูหมายเหตุข้างต้นเกี่ยวกับการและ-crf-preset

  • คุณสามารถหยุดการเข้ารหัสด้วยctrl+ และดำเนินการกับzfg


0

เมื่อพิจารณาถึงคำตอบก่อนหน้านี้ฉันพบสิ่งต่อไปนี้:

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

สมมติว่าไฟล์มีชื่อลงท้ายด้วย265.mkvเสมอ 264.mkvตอนจบนี้จะถูกแทนที่ด้วย

หากการตั้งชื่อไฟล์ของคุณแตกต่างคุณจะต้องปรับคำสั่งให้เหมาะสม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.