วิธีการรวมวิดีโอหลาย (มากกว่าสอง) บน Ubuntu?


38

ฉันต้องการรวมวิดีโอเป็นชุดขนาดละยี่สิบ (20) อัน ฉันใช้เครื่องลีนุกซ์ วิดีโออยู่ในรูปแบบ mp4 และคุณภาพปานกลาง บางคนมีกระแสข้อมูลเสียงหายไป จนถึงขณะนี้ผมได้พยายามffmpeg, mencoder, และcvlc/vlc MP4Boxฉันต้องการเขียนสคริปต์บรรทัดคำสั่งเพื่อให้ได้สิ่งนี้เนื่องจากฉันกำลังประมวลผลแบทช์

ปัญหาหลักคือโซลูชันที่ฉันพยายามใช้งานได้ดีสำหรับวิดีโอสองรายการบางวิดีโอทำงานได้ดีสำหรับวิดีโอที่มีสตรีมเสียง อย่างไรก็ตามฉันไม่สามารถค้นหาโซลูชันที่ครอบคลุมสำหรับงานนี้ได้


2
โปรดอย่าถามคำถามเดียวกันในหลายไซต์ SE: superuser.com/questions/928548/…
Maythux

คุณช่วยโพสต์สิ่งที่คุณลองมาเป็นพิเศษได้ไหม
ohaal

1
@ohaal ฉันลองใช้วิธีการเรียงต่อกันต่าง ๆ ที่กำหนดไว้ffmpegรวมถึงตัวกรองและโปรโตคอลไฟล์ ฉันยังพยายามใช้คุณสมบัติของconcat cvlc/vlcฉันยังพยายามคุณสมบัติของconcat mencoderทั้งหมดนี้ทำงานได้บางส่วน ในที่สุดนี่ก็ช่วยฉันแก้ปัญหา
Dhruv Singal

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

ฉันเห็นประเด็นของคุณแล้ว น่าเสียดายที่ฉันไม่สามารถแสดงรายการคำสั่งได้เนื่องจากจำนวนเต็มที่ คำสั่งที่แก้ไขปัญหาของฉันคือนี่melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
Dhruv Singal

คำตอบ:


41

ฉันใช้mkvmergeเพื่อเข้าร่วมไฟล์ MP4 หลายไฟล์เป็นไฟล์เดียว:

mkvmerge -o outfile.mkv infile_01.mp4 \+ infile_02.mp4 \+ infile_03.mp4

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

นี่คือวิธีการติดตั้งmkvmerge: tipsonubuntu.com
Morgoth

เฉพาะคำสั่งนี้ mkvmerge เท่านั้นที่ทำงานได้ ffmpeg ทุกตัวล้มเหลวด้วยเสียงที่เปลี่ยนอย่างน้อย
42n4

25

คุณสามารถทำได้โดยใช้ffmpeg:

ffmpeg -i concat:"input1.mp4|input2.mp4" output.mp4

ข้อมูลอ้างอิงและอื่น ๆ


2
ฉันพยายามทำอย่างนั้น ปัญหานี้คือมันไม่ได้ให้ออกที่เหมาะสม 1. แทร็กเสียงจะงง 2. มีการรบกวนในแทร็กวิดีโอ
Dhruv Singal

ฉันใช้มันมากกว่าตัวอย่างผลที่ได้คือคุณภาพสูงบางทีคุณภาพวิดีโอต้นฉบับของคุณเป็นปัญหาหรือไม่
Maythux

คุณอาจจะถูกต้อง วิธีนี้แก้ไขปัญหาได้: askubuntu.com/a/637179/420614
Dhruv Singal

2
อย่าใช้โปรโตคอล concat เพื่อเชื่อม MP4 ใช้งานได้กับบางรูปแบบที่ผู้ใช้ทั่วไปส่วนใหญ่ไม่พบเท่านั้น ใช้concat demuxer หรือ concat filterแทน
llogan

ฉันลอง ffmpeg ด้วยไฟล์ mp4 2 ไฟล์แต่ละ 30 นาที ฉันได้ไฟล์เอาต์พุตที่มีความยาว 7 ชั่วโมง
Guus

7

วิธีนี้แก้ไขปัญหาได้ที่: https://stackoverflow.com/a/22324018/5014767

meltเป็นอรรถประโยชน์บรรทัดคำสั่งที่ดีสำหรับการนี้ นี่คือหน้า

แก้ไขจากความคิดเห็น: คำสั่งที่แก้ไขปัญหาของฉันคือสิ่งนี้ melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264


4

ฉันเขียนเชลล์สคริปต์เล็กน้อยเพื่อเชื่อมต่อ MP4 โดยไม่แปลงรหัสโดยใช้ ffmpeg

for f in $(ls *.MP4); do
    ffmpeg -i $f -c copy -bsf:v h264_mp4toannexb -f mpegts $f.ts
done

CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")

ffmpeg -i "concat:$CONCAT" -c copy -bsf:a aac_adtstoasc output.mp4

rm *.ts

สิ่งนี้จะสร้างไฟล์กลางในคอนเทนเนอร์ MPEG จากนั้นเชื่อมไฟล์เหล่านั้นเข้ากับ MP4


โปรดทราบว่าสคริปต์นี้จะล้มเหลวหากชื่อไฟล์ใดมีช่องว่างหรือในบางกรณีตัวอักษรพิเศษ สำหรับวงก็มีนัยสำคัญดีกว่าการใช้เพียงโดยไม่ต้องใช้for f in *.MP4 ls(คุณควรหลีกเลี่ยงการใช้lsในสคริปต์สำหรับคู่ของเหตุผลสำคัญ; มีตัวเลือกที่ดีกว่า.) นอกจากนี้ยังมีคำพูดที่ใช้สำหรับตัวแปรจนกว่าคุณจะได้บางอย่างที่ไม่มีช่องว่างหรืออักขระพิเศษอื่น ๆ ดังนั้น"${f}"(หรือเพียงแค่"$f") แทน $funquoted
Paddy Landau

CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")ใช้งานไม่ได้ดีกับชื่อไฟล์ที่ 1, 2, 3 ... 10 ... 20. การแยกวิเคราะห์ไฟล์เป็น 1, 10 ... 2, 20 ... ฯลฯ ฉันขอแนะนำCONCAT=$(echo $(ls -v *.ts) | sed -e "s/ /|/g")ให้มั่นใจว่าจะสั่งซื้อ .
tisaconundrum

2

สร้างไฟล์ files.txt พร้อมไฟล์ทั้งหมดที่คุณต้องการต่อกันในรูปแบบต่อไปนี้ (บรรทัดที่ขึ้นต้นด้วย # จะถูกข้าม):

# this is a comment
file 'file1.mp4'
file '/path/to/file2.mp4'
file 'file3.mp4'

โปรดทราบว่าสิ่งเหล่านี้อาจเป็นเส้นทางแบบสัมพันธ์หรือแบบสัมบูรณ์ จากนั้นคุณสามารถสตรีมคัดลอกหรือเข้ารหัสไฟล์ของคุณอีกครั้ง:

ffmpeg -f concat -safe 0 -i files.txt -c copy output.mp4

0

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

ต้องใช้ไฟล์ที่จะมีความละเอียดเดียวกัน ยอมรับการหมุนเมตาดาต้าที่แตกต่างกันซึ่งffmpeg concat:ไม่ได้

rm ffmpeg-concat-output.mkv

FILE_COUNT=$#
INPUTS=""
FILTER=""
INDEX=0
for FNAME in $@; do
    echo "Processing ${FNAME}"
    INPUTS="${INPUTS} -i $FNAME"

    if [ -z "${FILTER}" ]; then
        FILTER="[$INDEX:v:0] [$INDEX:a:0]"
    else
        FILTER="${FILTER} [$INDEX:v:0] [$INDEX:a:0]"
    fi
    let INDEX+=1
done

COMMAND="ffmpeg ${INPUTS} \
    -filter_complex '${FILTER} \
        concat=n=${INDEX}:v=1:a=1 [v] [a]' \
    -map '[v]' -map '[a]' \
    ffmpeg-concat-output.mkv"

#   -af 'volume=15dB' # won't work with -filter_complex

bash -c "${COMMAND}"

0

ฉันสร้างสคริปต์ Pythonที่ใช้moviepyสามารถเชื่อมโยงกับส่วนย่อย (มีประโยชน์หากคุณต้องการลบตัวอย่างบางส่วนออกจากวิดีโอ)

ใช้กับ:

vcat -i inputfile1,inputfile2[start-end],... -o <outputfile>

-1

นอกจากคำตอบของ Maythux จาก :

คอนเทนเนอร์มัลติมีเดียบางตัว (MPEG-1, MPEG-2 PS, DV) อนุญาตให้หนึ่งต่อวิดีโอเข้าด้วยกันโดยการต่อไฟล์ที่มีอยู่เข้าด้วยกันเท่านั้น

เช่นวิดีโอที่จะตัดแบ่งใช้หนึ่งในคอนเทนเนอร์วิดีโอดังกล่าวข้างต้น (ซึ่งฉันจะเพิ่ม MPEG-4 ตอนที่ 14 สำหรับประสบการณ์ส่วนตัว) คุณสามารถ:

cat video1.ext video2.ext video3.ext > video4.ext

1
ฉันลองสิ่งนี้ แต่มันจะส่งคืนวิดีโอแรกเป็นเอาต์พุตเท่านั้น ฉันอ่านบางที่มันไม่ทำงานแม้ว่าฉันจะไม่จำเหตุผลที่อยู่เบื้องหลังนี้
Dhruv Singal

@DhruvSingal ใช่ฉันสามารถยืนยันสิ่งนี้ได้ฉันได้ลองในวิดีโอ MP4 สองไฟล์ที่มีการเข้ารหัสวิดีโอ / เสียงเดียวกันและคุณสามารถเรียกดูวิดีโอแรกได้เท่านั้น ซึ่งดูเหมือนว่าสมเหตุสมผล แต่ฉันค่อนข้างแน่ใจว่าฉันได้ทำสิ่งนี้มาก่อนด้วยวิดีโอ MP4 สองสามครั้ง บางทีหน่วยความจำอาจไม่ได้ทำงานที่นี่หรือมีข้อกำหนดอื่น ๆ สำหรับการทำงาน ฉันต้องการค้นคว้าเกี่ยวกับเรื่องนี้ตั้งแต่ฉันสนใจเช่นกันหากฉันพบบางสิ่งบางอย่างฉันจะอัปเดตคำตอบและส่งความคิดเห็นถึงคุณ
kos

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