สร้างวิดีโออัตโนมัติโดยเพิ่มอินโทรและวิดีโอต่อท้ายไปยังวิดีโอหลัก


1

ฉันมีโครงการวิดีโอที่ฉันพยายามรวบรวม นี่คือภาพรวม:

  1. ฉันมีวิดีโอมากมายซึ่งเป็น 5 นาทีการฝึกซ้อม - วิดีโอหลัก
  2. วิดีโอแนะนำจะเป็นวิดีโอมาตรฐาน 5 วินาทีที่จะมีชื่อวิดีโอและผู้แต่ง สิ่งนี้จะถูกต่อเข้ากับวิดีโอหลัก
  3. วิดีโอต่อท้ายจะสวยมากเป็นวิดีโอสต็อกที่จะต่อกับวิดีโอหลักและมี legaleze ทั้งหมดเป็นต้น
  4. Intro Vid จะจางหายไปในวิดีโอหลักอย่างราบรื่นเช่นเดียวกับเมื่อคุณจบวิดีโอหลักมันจะจางหายไปในวิดีโอต่อท้ายอย่างสวยงาม
  5. ผลิตภัณฑ์นี้เป็นวิดีโอใหม่พร้อมวิดีโอแนะนำ, วิดีโอหลัก & ตัวอย่างทั้งหมดในที่เดียว!

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

วิธีการแก้ปัญหานี้เป็นสคริปต์ Bash ที่ใช้ไฟล์กำหนดค่าที่มีชื่อผู้แต่ง ฯลฯ และสร้าง Intro, Ending และสร้างวิดีโอผลลัพธ์พร้อมกัน

ฉันใช้เซิร์ฟเวอร์ Ubuntu 12.04 ฉันได้ลองใช้สิ่งนี้เป็นตัวอย่างและเพิ่งรันโดยไม่มีโชคเนื่องจากข้อผิดพลาดที่ไม่เข้ากัน ฉันพยายามแปลงมันด้วย.MP4ตู้คอนเทนเนอร์หรือ.MKV. ฉันพบข้อผิดพลาดหลังจากข้อผิดพลาดหรือปัญหาความไม่ลงรอยกัน ฉันเปลี่ยนไปffmpegใช้ไบนารีโดยใช้รุ่น 25 ต.ค. 2556 จากhttp://ffmpeg.gusari.org/static/64bit/ซึ่งฉันชอบเพราะฉันไม่ต้องกังวลกับการสร้างไบนารีขึ้นมาใหม่ เกือบจะประสบความสำเร็จ แต่อีกครั้งฉันมีข้อผิดพลาดซึ่งฉันไม่สามารถแก้ไขได้

ฉันรู้ว่าส่วนหนึ่งของปัญหาคือความจริงที่ว่าการผลิตวิดีโอตัวแปลงสัญญาณรูปแบบเป็นฟิลด์ใหม่ที่สมบูรณ์แบบสำหรับฉันดังนั้นฉันจึงพยายามทำงานผ่านอาณาเขตใหม่นี้

บางทีผู้เชี่ยวชาญที่นี่อาจมีบางอย่างที่คล้ายกันซึ่งฉันสามารถใช้เป็นแนวทางที่ใช้รูปแบบ MP4 หรือ h.264 หรือใช้วิธีแก้ไขปัญหาข้างต้นจาก URL และทำให้ทำงานได้กับ ffmpeg รุ่นที่เป็นปัจจุบันมากขึ้น

ฉันจะรวมสคริปต์และไฟล์พารามิเตอร์และเอาต์พุต (ตัวย่อเนื่องจากข้อ จำกัด ) ด้านล่าง [matroska,webm @ 0x27bbee0] Read errorโดยทั่วไปเป็นสคริปต์ยืนตอนนี้ทำงานเมื่อฉันได้รับข้อผิดพลาด ข้อผิดพลาดนี้ส่งคืนจากรูทีน 'reasembleVideo' จากคำสั่ง ffmpeg แรก

ต่อไปนี้เป็นไฟล์พารามิเตอร์:

#!/bin/bash
INPUTFILE="ssh_main.mp4"
LOGO="logo.png"
LOGOLENGTH="1"
SPEAKER="Jason"
TITLE="Basic SSH Video"
DATE="October 28, 2013"
SCENESTART="00:00:01"
SCENEDURATION="00:00:09"
OUTPUTFILE="ssh_basic_1"
}

ต่อไปนี้เป็นสคริปต์ที่ฉันใช้ ${OUTPUTFILE}ถูกนำมาใช้เป็นวิดีโอ 2 นาทีขนาดเล็กที่ฉันสร้างหน้าจอ-o-matic ในรูปแบบ MP4

สคริปต์บน PasteBin (ยาวเกินไปสำหรับโพสต์ผู้ใช้ขั้นสูง)


1
"ฉันมีข้อผิดพลาดบางอย่างซึ่งฉันไม่สามารถแก้ไขได้" การเพิ่มข้อผิดพลาดที่แม่นยำอาจช่วยได้จริง
Hennes

1
โปรดเขียนสคริปต์แบบเต็มที่คุณใช้ โปรดให้เอาต์พุตคอนโซลเต็มรูปแบบที่คุณได้รับ สิ่งที่คุณต้องการบรรลุนั้นเป็นที่เข้าใจ
Rajib

มีฟีเจอร์อัพโหลดที่ฉันสามารถใส่ตัวอย่างและสคริปต์ได้หรือไม่? มิฉะนั้นฉันจะใส่ข้อมูลพรุ่งนี้เช้า
DevDewboy

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

@Rajib ฉันได้รับข้อมูลที่คุณต้องการ แจ้งให้เราทราบหากคุณต้องการสิ่งอื่นใด
DevDewboy

คำตอบ:


1

ในสภาพแวดล้อมการผลิตเมื่อมีวิดีโอจำนวนมากให้เข้าร่วมเพื่อทำให้กระบวนการคุณสามารถแบ่งเป็นองค์ประกอบสี่อย่างโดยอัตโนมัติ ให้บอกว่าคุณมีวิดีโอฝึกอบรมหลัก 100 รายการเพื่อเริ่มต้น เหล่านี้มีชื่อว่า main001.mov, main002.mov และต่อไปจนถึง main100.mov

  • สร้าง 100 ชื่อการ์ดของคุณเป็น png หรือรูปแบบอื่น ๆ ผ่าน imagemagick / graphicsmagick / gimp / photoshop / อะไรก็ตาม
  • แปลงไฟล์เหล่านี้เป็นไฟล์ mov ใน ffmpeg ฉันแสดงโดยใช้ไฟล์เสียงสเตอริโอที่เตรียมไว้ซึ่งเงียบกว่าแทนที่จะนำเข้ามาจากอุปกรณ์ null แต่นั่นก็ใช้ได้เหมือนกัน สิ่งนี้สร้างชื่อ 5 วินาทีโดยจางหายไปและหายไป:
#!/bin/bash  

for i in *.png;  
do  
ffmpeg -y -loop 1 -f image2 -i $i -i silence.wav -t 00:00:05 -s 1920x1080 -aspect 16:9 -acodec pcm_s24le -b:a 128k -vcodec qtrle -b:v 1024k -filter_complex 'fade=in:0:10, fade=out:110:10' -f mov ${i%%.png}.mov

done

สิ่งนี้สร้างชื่อเรื่อง (100) mov จากไฟล์ png ที่ให้มา

  • สร้างการ์ดจบของคุณเป็น png และแปลงเป็น mov เหมือนตอนนี้คุณสามารถพูดได้:
ffmpeg -y -loop 1 -f image2 -i endcard.png -i silence.wav -t 00:00:05 -s 1920x1080 -aspect 16:9 -acodec pcm_s24le -b:a 128k -vcodec qtrle -b:v 1024k -filter_complex 'fade=in:0:10, fade=out:110:10' -f mov endcard.mov
  • เชื่อมไฟล์สามชุดเข้าด้วยกันสองชุดแรกมี 100 ไฟล์แต่ละไฟล์ชื่อและไฟล์หลักและชุดที่สามมีไฟล์สิ้นสุดทั่วไปเพียงไฟล์เดียว สำหรับสิ่งนี้คุณใส่ชื่อไฟล์ของชุดในสามอาร์เรย์และวนรอบดัชนีของอาร์เรย์เพื่อเข้าร่วมดังนี้:
#!/bin/bash  

# define the movie array  

movie=("main001.mov" "main002.mov" .....and so on till ... "main100.mov")  

#define titles array  

title=("title001.mov" "title002.mov" .....and so on till ... "title100.mov")  

#define end card array  

endcard=("endcard.mov")  

# Use for loop  
# get total subscripts in an array  

total=${#movie[*]}  

for (( i=0; i<=$(( $total -1 )); i++ ))  
do  
ffmpeg -i ${title[i]} -i ${movie[i]} -i ${endcard[0]} -y -filter_complex '[0:0] setsar=1/1[sarfix];[sarfix] [1:0]  [2:0] concat=n=3:v=1:a=0 [v]' -map '[v]' -pass 1 -strict -2 -an -vcodec libx264 -pix_fmt yuv420p -aspect 16:9 -threads 4 -b:v 1024k -flags +loop -cmp chroma -partitions +parti4x4+partp8x8+partb8x8 -subq 1 -trellis 0 -refs 1 -bf 3 -b_strategy 2 -coder 1 -me_range 16 -g 250 -keyint_min 75 -sc_threshold 40 -i_qfactor 0.71 -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 ${movie[i]%%.mov}.mp4

ffmpeg -i ${title[i]} -i ${movie[i]} -i ${endcard[0]} -y -filter_complex '[0:0] setsar=1/1[sarfix];[sarfix] [0:1] [1:0] [1:1] [2:0] [2:1] concat=n=3:v=1:a=1[v] [a]' -map '[v]' -map '[a]' -strict -2 -acodec aac -b:a 128k -pass 2 -vcodec libx264 -pix_fmt yuv420p -aspect 16:9 -threads 4 -b:v 1024k -flags +loop -cmp chroma -partitions +parti4x4+partp8x8+partb8x8 -mixed-refs 1 -subq 6 -trellis 1 -refs 5 -bf 3 -b_strategy 2 -coder 1 -me_range 16 -g 250 -keyint_min 75 -sc_threshold 40 -i_qfactor 0.71 -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 ${movie[i]%%.mov}.mp4

done

รหัสผ่าน 1 ไม่ได้คำนึงถึงเสียงของบัญชี ดัชนีของอาร์เรย์ endcard เป็นแบบคงที่ที่ 0 เนื่องจากมีเพียงหนึ่งเดียว แน่นอนคุณสามารถส่งชื่อไฟล์ได้โดยตรงที่นี่แทนที่จะใช้อาเรย์ อาจต้องใช้ Sarfix หากภาพยนตร์ชื่อเรื่องหรือแม้กระทั่งภาพยนตร์ endcard ทำให้เกิดปัญหา ฉันไม่ได้แสดงตัวเลือก sarfix สำหรับภาพยนตร์ end card - ที่ต้องใช้ setsar = 1/1 [sarfix]; [sarfix] หลังจากทำแผนที่ [2: 0] หมายเหตุขนาดและบิตเรตอาจใช้ไม่ได้กับคุณ

ด้วยวิธีนี้คุณสามารถเชื่อมต่อไฟล์หลักจำนวนมากโดยอัตโนมัติด้วยชื่อเรื่องและการ์ดปลายทาง


0

คุณมี 2 $ {OUTPUTFILE} .mkv หรือไม่ หนึ่งตัวสำหรับอินพุตหลักและอีกอันสำหรับเอาต์พุตสุดท้าย? เปลี่ยนอันสุดท้ายอย่างชัดเจนเป็นอย่าง $ {FINALOUTPUT} .mkv คุณกำลังใช้โปรโตคอล concat ในรูปแบบ mkv คุณควรใช้ concat demuxer หรือเปลี่ยนไฟล์ระดับกลางทั้งหมดเป็นรูปแบบ mpeg หรือ. ts นอกจากนี้:

ใส่อัตรา - r 29.97 หลังจาก -i "$ {OUTPUTFILE} -frames" / frames%d.png
ดังนั้นแทนที่จะ:
./ffmpeg -threads 4 -r 29.97 -f image2 -i "${OUTPUTFILE}-frames"/frame%d.png \ -i "${OUTPUTFILE}.mkv" -c:a copy \ -map 0:0 -map 1:0 -f MP4 -y "${OUTPUTFILE}.mkv"

ใช้:
./ffmpeg -threads 4 -f image2 -i "${OUTPUTFILE}-frames"/frame%d.png -r 29.97 \ -i "${OUTPUTFILE}.mkv" -c:a copy \ -map 0:0 -map 1:0 -f MP4 -y "${OUTPUTFILE}.mkv"

ในช่วงการต่อข้อมูลให้ลองโดยไม่มีอัตรา:
./ffmpeg -threads 4 \ -i concat:"${OUTPUTFILE}-intro.mkv"\|"${OUTPUTFILE}.mkv"\|"${OUTPUTFILE}-exit.mkv" \ -y "${FINALOUTPUT}.mkv"

หากวิธีนี้ใช้ไม่ได้ผลคุณจะต้องใช้ตัวเลือก concat อื่น ๆ เช่น concat demuxer:
ffmpeg -f concat -i mylist.txt -c copy output
mylist.txt มีรายการไฟล์ที่สร้างขึ้นสามไฟล์
ดูนี่สิ

นอกจากนี้ยังมีปัญหาอื่น ๆ เกี่ยวกับสตรีมหนึ่งค่าเริ่มต้นที่ yuv444p และอีกประเด็นหนึ่งคือ yuv420p อย่างชัดเจน สิ่งนี้ควรมี -pix_fmt yuv420p ระบุไว้อย่างชัดเจน:
ffmpeg -loop 1 -i "${OUTPUTFILE}-intro.png" -q:v 1 -r 29.97 -t ${LOGOLENGTH} -y -f MP4 "${OUTPUTFILE}-logo1.mkv"
เช่นเดียวกับขั้นตอนต่อไป:
ffmpeg -i "${OUTPUTFILE}-logo1.mkv" -i "silence.mkv" \ -c:v copy -c:a copy -map 0:0 -map 1:0 -threads 4 \ -y -f MP4 "${OUTPUTFILE}-intro.mkv"


สำหรับสติของคุณเองอย่าใช้สคริปต์ยาวเดี่ยวเพื่อทำภารกิจ 3 หรือ 4 อย่างแยกสคริปต์ออกอย่างน้อยในขั้นตอนการทดสอบจนกว่าพวกเขาจะทำงานทั้งหมด ดูเหมือนว่าอัตราเฟรมจะเป็นสิ่งที่เหม็นขึ้นเมื่อ ffmpeg ไปที่เฟรมสุดท้ายของวิดีโอหัวเรื่องระหว่างการต่อข้อมูล
Rajib

ฉันเพิ่งรู้ว่าอินพุตและเอาต์พุตทั้งหมดของคุณดูเหมือนจะมีตัวแปร $ {OUTPUTFILE} คุณไม่สามารถตั้งชื่อตัวแปรสำหรับแต่ละเฟสให้เจาะจงมากขึ้นเช่น $ {TITLEWITHSOUND} หรือไม่?
Rajib

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