ffmpeg - วิธีการคัดลอก | แยกการตั้งค่าการเข้ารหัสจากไฟล์สื่อที่มีอยู่?


19

ฉันต้องการทำสิ่งนี้หลายครั้งในขณะนี้ดังนั้นฉันจึงถาม

ถ้าฉันมีไฟล์วิดีโอหรือไฟล์เสียงอยู่ffmpegแล้วmplayerและเครื่องเล่นมีเดียอื่น ๆ สามารถตรวจจับได้ว่าอย่างน้อยบางอย่างของมันคือ "propreties" เช่น container, codec และ bitrate ที่ใช้อาจมีคุณภาพและการเข้ารหัสเฉพาะการตั้งค่าต่าง ๆ เป็นต้น

ฉันจะแยกการตั้งค่าเหล่านี้จากไฟล์ที่มีอยู่เพื่อใช้ (โดยตรง) สำหรับการเข้ารหัสด้วย ffmpeg ได้อย่างไร

ตัวอย่างเช่นฉันได้รับการmkvเข้ารหัสวิดีโอx264ด้วยการตั้งค่าบางอย่างและaviไฟล์อื่นที่ไม่มีการบีบอัด ฉันต้องการ "คัดลอก" การตั้งค่าการเข้ารหัสที่ใช้ในไฟล์ x264 mkv เพื่อแปลงรหัส avi ด้วยการตั้งค่าเดียวกัน

หมายเหตุ: ฉันกำลังมองหาวิธีที่ไม่ควรรวมงานของมนุษย์ไว้กับ "แปล" การตั้งค่าจากตัวถอดรหัสเป็นตัวเข้ารหัส ไม่เป็นไรหากฉันต้องการแยกการตั้งค่าก่อนและบันทึกไว้ที่อื่น แต่ฉันต้องการให้สามารถป้อนตัวเลือกการอ่านไปยังบรรทัดคำสั่งหรือไฟล์การตั้งค่าล่วงหน้าสำหรับ ffmpeg


คุณอาจเรียงลำดับผลลัพธ์ของffprobe(โดยเฉพาะกับ-show_streamsและ-show_formatตัวเลือก) และใช้ข้อมูลนั้นเพื่อเขียนสคริปต์สิ่งที่สำคัญ
evilsoup

1
บ่อยครั้งที่ใช้การตั้งค่าเดียวกันเช่นบิตเรต (พยายามคัดลอกบิตเรตที่แน่นอนซึ่งเป็นที่นิยมในหมู่ผู้ใช้) จะไม่ส่งผลให้ได้คุณภาพที่ดีที่สุด แน่นอนว่าฉันไม่มีเงื่อนงำสิ่งที่อินพุตทั่วไปของคุณเป็นเช่นนั้น แต่ด้วยการใช้-crfตัวเลือกx264 แนะนำโดยทั่วไป ดูFFmpeg และ x264 เข้ารหัสคู่มือ
24411 llogan

ฉันไม่พบสิ่งใดเกี่ยวกับการตั้งค่าการเข้ารหัสในเอาต์พุตของ ffprobe :(
thelolcat

มันแสดงให้เห็นจำนวนของ ReFrames เท่านั้น แต่ไม่ใช่การตั้งค่าอื่น ๆ เช่น mediainfo ทำ
thelolcat

ไวยากรณ์อินพุตกับ ffmpeg แตกต่างจากเขตข้อมูลเมตา เช่นคุณสามารถอ่านchannels:6จากไฟล์วิดีโอ -ch:6แต่การเข้ารหัสมันคุณจะต้องใช้สวิทช์ สวิทช์บางคนใช้ 1 ตัวอักษรการใช้งานบางอย่างที่สอง ฯลฯ
jiggunjer

คำตอบ:


10

ไม่มีวิธีอัตโนมัติในการทำเช่นนั้น คุณต้องดูพารามิเตอร์ของไฟล์ต้นฉบับและนำไปใช้กับไฟล์ที่ส่งออก

ในกรณีส่วนใหญ่สิ่งเหล่านี้จะเป็นดังนี้:

  • รูปแบบคอนเทนเนอร์ (MP4, MKV, …)
  • ตัวแปลงสัญญาณวิดีโอและเสียง (H.264, H.265, …)
  • เสียงที่เฉพาะเจาะจง:
    • จำนวนช่องสัญญาณเสียง
    • อัตราสุ่มตัวอย่างเสียง
    • บิตเรตเสียง
  • เฉพาะวิดีโอ:
    • โปรไฟล์และระดับ (เพื่อความเข้ากันได้ดูที่นี่ )
    • ข้อ จำกัด บิตเรตสูงสุด (เช่นสำหรับ H.264 )
    • ความละเอียดวิดีโอสูงสุดเปลี่ยนผ่าน-filter:v scaleหรือ-s:v
    • รวมเฟรมเปลี่ยนผ่าน -filter:v fps -r
    • การสุ่มตัวอย่าง Chroma เปลี่ยนผ่าน-pix_fmt(เช่น-pix_fmt yuv420pควรให้ความเข้ากันได้ดีที่สุด)
    • ขนาด GOP (ระยะห่างระหว่างเฟรม IDR) ตั้งค่าผ่าน -g
    • การตั้งค่าการเข้ารหัสเฉพาะอื่น ๆ

แต่ถึงแม้ว่าคุณจะเข้าใจถูกต้อง แต่อุปกรณ์บางอย่างอาจต้องการข้อมูลเฉพาะที่เป็นกรรมสิทธิ์ซึ่งฝังอยู่ในบิตสตรีม


สำหรับงานเฉพาะของการใช้x264งานนี้จะไม่เป็นเรื่องเล็กน้อย ฉันไม่ทราบถึงสคริปต์เดียวที่จะดูแลงานเหล่านี้ซึ่งมักทำด้วยตนเอง สำหรับข้อมูลส่วนใหญ่เกี่ยวกับการตั้งค่าการเข้ารหัสบน Unix / Linux หรือ OS X คุณสามารถใช้mediainfoกับเทคนิค Bash บางอย่างได้

ตัวอย่างเช่นสำหรับวิดีโอที่เข้ารหัส x264 ในไฟล์ MP4:

mediainfo input.mp4 | grep "Encoding settings" | cut -d':' -f2- | tr '/' '\n' | sed 's/ //'

นี่จะแสดงรายการตัวเลือก x264:

cabac=1
ref=3
deblock=1:-1:-1
analyse=0x3:0x113
me=hex
subme=7
psy=1
…

จากนั้นคุณสามารถผ่านตัวเลือกเหล่านี้ไปยังไบนารี x264 ด้วยตนเอง

ถ้าคุณผ่าน FFmpeg นั่นก็ซับซ้อนกว่านิดหน่อยเนื่องจากตัวเลือกทั้งหมดของ x264 ไม่สามารถหรือควรแมปแบบนี้ โปรดทราบว่าบ่อยครั้งที่การตั้งค่าล่วงหน้าการปรับแต่งและข้อมูลจำเพาะจะทำได้ง่ายเช่นกัน (ตามที่เห็นในx264 --fullhelpและคู่มือการเข้ารหัส x264 ) และการระบุระดับ CRF ก็เพียงพอแล้ว

และนี่ไม่ได้พิจารณาเรื่องเสียงด้วยซึ่งโชคดีที่มีตัวเลือกไม่มาก


ดังนั้นมันเป็นไปไม่ได้กับ ffprobe หรือ ffmpeg?
thelolcat

ไม่ไม่สามารถทำได้โดยตรงกับ ffprobe / ffmpeg ในกรณีของวิดีโอ x264 เข้ารหัสผมจะใช้mediainfoการส่งออกและแผนที่ตัวเลือกเหล่านี้จะ ffmpeg -x264-paramsกับ (ดูที่คู่มือการเข้ารหัส x264 ) แต่ถ้าคุณต้องการโซลูชันทั่วไปสำหรับตัวแปลงสัญญาณ / ตัวเข้ารหัสหรือรูปแบบคอนเทนเนอร์ทุกประเภทคุณจะต้องเขียนสคริปต์ที่มีความซับซ้อนปานกลางซึ่งทำการแปลง
slhck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.