Score:2

จะรวมไฟล์วิดีโอหลายไฟล์ด้วยตัวแปลงสัญญาณที่แตกต่างกันได้อย่างไร MP4/H.265

ธง cn

ฉันมีมากมาก มาก สคริปต์น่าเกลียดในการรวมไฟล์หลายไฟล์ของเกมฟุตบอลของฉัน (ฉันมีกล้อง 10 ตัวต่อเกม) และตอนนี้ฉันเริ่มสร้างไฮไลท์ของแต่ละเกม แต่กล้องบางตัวมีอัตราเฟรมที่แตกต่างกันและใช้ตัวแปลงสัญญาณที่แตกต่างกัน ดังนั้นตอนนี้ฉันสูญเสียอย่างสิ้นเชิงเกี่ยวกับวิธีทำให้สิ่งเหล่านี้ทำงานใน linux ฉันโอเคกับ GUI หรือซอฟต์แวร์ตัดต่อวิดีโออื่นๆ ถ้านั่นคือสิ่งที่ควรทำ

สคริปต์น่าเกลียด (สำหรับบริบท)

#!/bin/bash

#filesList=""
#for ไฟล์ใน $(ls -1v *.MP4);do #lists ไฟล์ที่มีเลขคู่
# filesList="${filesList}${file}|"
#เสร็จแล้ว
#filesList=${filesList%?} # ลบไปป์ต่อท้าย
#ffmpeg -i "concat:$filesList" -c copy ../$(วันที่ +%Y%m%d_%H%M%S)_merged.mp4
#ปรับแต่งด้วยตัวคุณเอง


SimpleCopy(){    
    printf "คุณต้องการภาพขนาดย่อ:\n"
    เลือกคำตอบใน Yes No Mkv
    ทำ
        หยุดพัก;
    เสร็จแล้ว
}

ตรวจสอบโฟลเดอร์ (){ 
    d=$(zenity --file-selection --title="เลือกไดเร็กทอรีและรวมไฟล์ .MP4 ทั้งหมดภายในโฟลเดอร์" --directory)
}

SimpleCopy
ตรวจสอบโฟลเดอร์

ซีดี "$d"
เสียงสะท้อน $(pwd)
howManyFolders=$(ls -l -tr "$(pwd)" | grep -c ^d)

ถ้า [ $howManyFolders -gt 1 ] 
แล้ว
    ตรวจสอบโฟลเดอร์
ไฟ

currentDate=$(วันที่ +'%m.%d.%Y_%H.%M')
safeVideoName="${d/ /_}"
safeVideoName="${safeVideoName////}"
echo "safeVideoName: ${safeVideoName}"
videoName="../${safeVideoName}_${currentDate}_merged"


ถ้า [ "$answer" = "ใช่" ] 
    แล้ว
        จำนวนวิดีโอ = 0
        ตัวกรองวิดีโอ=""
        รายการไฟล์ = ""
        สำหรับไฟล์ใน $(ls -1v | grep -i mp4);do 
            filesList="${filesList} -i ${file}"
            videoFilter="${videoFilter}[${numberOfVideos}:v][${numberOfVideos}:a]"
            
            ให้ "numberOfVideos=numberOfVideos+1"
        เสร็จแล้ว
        echo "ตัวกรองวิดีโอ: ${videoFilter}"
        ffmpeg $filesList -vf "transpose=2,transpose=2,transpose=2" -filter_complex "${videoFilter}concat=n=${numberOfVideos}:v=1:a=1[vv][a];[vv ]overlay=main_w-overlay_w-5:main_h-overlay_h-5[v]:" -map "[v]" -map "[a]" ${videoName%/}.mp4
    elif [ "$answer" = "Mkv" ]
    แล้ว
        ffmpeg -safe 0 -f concat -i <(find . -type f -name '*.MP4' -printf "file '$PWD/%p'\n" | sort) -c copy ${videoName%/} เอ็มเควี
    อื่น
        ls -1v -tr | grep -i mp4 | perl -ne '$_ =~ s/\n$//; พิมพ์ "ไฟล์ '"'"'$_'"'"'\n"' | ffmpeg -safe 0 -protocol_whitelist file,tcp,http,pipe -f concat -i - -c copy "${videoName%/}.mp4"
ไฟ

เมื่อฉันรวมไฟล์ ไฟล์ H.265 จะเล่นได้ดี แต่เมื่อเป็น MP4 จะมีเพียงเฟรมสุดท้ายจากไฟล์ H.265 และเสียงจาก MP4

พบข้อผิดพลาดเมื่อผสาน

// cmd - echo ls -1v -tr | grep -i mp4 | perl -ne '$_ =~ s/\n$//; พิมพ์ "ไฟล์ '"'"'$_'"'"'\n"' | ffmpeg -safe 0 -protocol_whitelist file,tcp,http,pipe -f concat -i - -c copy "${videoName%/}.mp4"

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55f528e4d3c0] การแทรกตัวกรองบิตสตรีม h264_mp4toannexb อัตโนมัติ
[mp4 @ 0x55f528e4fb40] DTS ที่ไม่จำเจในเอาต์พุตสตรีม 0:1; ก่อนหน้า: 655360 ปัจจุบัน: 626560; เปลี่ยนเป็น 655361 ซึ่งอาจทำให้การประทับเวลาไม่ถูกต้องในไฟล์เอาต์พุต
[concat @ 0x55f528e436c0] DTS 1116270 < 1167534 ใช้งานไม่ได้
[mp4 @ 0x55f528e4fb40] DTS ที่ไม่จำเจในเอาต์พุตสตรีม 0:0; ก่อนหน้า: 1226574 ปัจจุบัน: 1175310; เปลี่ยนเป็น 1226575 ซึ่งอาจทำให้การประทับเวลาไม่ถูกต้องในไฟล์เอาต์พุต
[mp4 @ 0x55f528e4fb40] DTS ที่ไม่จำเจในเอาต์พุตสตรีม 0:1; ก่อนหน้า: 655361 ปัจจุบัน: 627584; เปลี่ยนเป็น 655362 ซึ่งอาจทำให้การประทับเวลาไม่ถูกต้องในไฟล์เอาต์พุต
[mp4 @ 0x55f528e4fb40] DTS ที่ไม่จำเจในเอาต์พุตสตรีม 0:0; ก่อนหน้า: 1226575 ปัจจุบัน: 1178313; เปลี่ยนเป็น 1226576 ซึ่งอาจทำให้การประทับเวลาไม่ถูกต้องในไฟล์เอาต์พุต
[mp4 @ 0x55f528e4fb40] DTS ที่ไม่จำเจในเอาต์พุตสตรีม 0:1; ก่อนหน้า: 655362 ปัจจุบัน: 628608; เปลี่ยนเป็น 655363 ซึ่งอาจทำให้การประทับเวลาไม่ถูกต้องในไฟล์เอาต์พุต

ป้อนคำอธิบายรูปภาพที่นี่

ฉันสามารถให้ตัวอย่างคลิปถ้าจำเป็น :)

raj avatar
cn flag
raj
สคริปต์ของคุณใช้ `ffmpeg` เพื่อรวมไฟล์โดยใช้เพียง `copy` pseudo-codec หากไฟล์มีการเข้ารหัสต่างกัน คุณต้องทำการเข้ารหัสจริงด้วย `ffmpeg` เช่นคุณต้องระบุชื่อตัวแปลงสัญญาณเอาต์พุตจริงแทน 'สำเนา' จากนั้น `ffmpeg` ควรรีโค้ดคลิปทั้งหมดเป็นรูปแบบที่คุณระบุ คุณอาจต้องเพิ่มพารามิเตอร์เพิ่มเติมเพื่อระบุรายละเอียดการเข้ารหัส เนื่องจาก 'ffmpeg' เป็นซอฟต์แวร์ที่ซับซ้อน คุณต้องทดลองและทดสอบว่าตัวเลือกใดให้ผลลัพธ์ที่ดีที่สุด
raj avatar
cn flag
raj
นอกจากนี้ คุณอาจต้องระบุรูปแบบเอาต์พุตจริงบางรูปแบบแทน "concat"
cn flag
อา น่าสนใจ ดังนั้นมันจะใช้เวลานานกว่ามาก แต่มันจะได้ผล ฉันสงสัยว่าฉันสามารถเข้ารหัสไฟล์ที่เป็น MP4 ไม่ใช่ 265 ได้หรือไม่ ฉันเดาว่าคุณสามารถเช็คอิน `ffmpeg` เพื่อตรวจสอบว่าไฟล์คืออะไร
raj avatar
cn flag
raj
ฉันไม่คิดว่า `ffmpeg` มีพารามิเตอร์ที่สามารถบอกได้ว่า "ถ้ารูปแบบเหมือนกัน ไม่ต้องเข้ารหัสใหม่" หากคุณไม่บอกให้ "คัดลอก" ก็จะเข้ารหัสใหม่เสมอ แม้จะเปลี่ยนจากรูปแบบเดียวกันเป็นรูปแบบเดียวกันก็ตาม ดังนั้น คุณจะต้องรีโค้ดคลิป H265 เป็น MP4 ก่อน (เช่น ใช้ `ffmpeg`) แล้วจึงรวมไฟล์ MP4 ทั้งหมดโดยใช้สคริปต์ของคุณ แต่คุณต้องแน่ใจว่าคุณแปลงเป็น MP4 ด้วยพารามิเตอร์ (ตัวแปลงสัญญาณ อัตราเฟรม ขนาด ฯลฯ) เหมือนกับ MP4 ที่คุณมีอยู่แล้ว
raj avatar
cn flag
raj
แต่คุณสามารถบอก `ffmpeg` อย่างชัดเจนเพื่อ 'คัดลอก' ไฟล์ที่เป็น MP4 อยู่แล้วและรีโค้ดไฟล์อื่นๆ แต่ต้องระบุก่อนว่าอันไหนอันไหน คุณสามารถใช้ `ffprobe` ที่มาพร้อมกับ `ffmpeg` เพื่อระบุไฟล์วิดีโอ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา