ตัดแต่งไฟล์เสียงโดยใช้เวลาเริ่มและหยุด


34

ฉันมีคำสั่ง FFmpeg เพื่อตัดแต่งเสียง:

ffmpeg -ss 01:43:46 -t 00:00:44.30 -i input.mp3 output.mp3

ผมมีปัญหากับคำสั่งนี้เป็นตัวเลือกที่-tต้องใช้ระยะเวลา (วินาที) จาก01:43:46 ฉันต้องการที่จะตัดเสียงโดยใช้เวลาเริ่ม / หยุดเช่นระหว่าง01:43:46และ00: 01: 45.02

เป็นไปได้ไหม


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

1
@Nasha ถูกต้องแล้ว ฉันจะแก้ไขโพสต์เพื่อให้ชัดเจนยิ่งขึ้น
user8547

1
ฉันได้ใช้คำถามของคุณใหม่อีกครั้ง อันที่จริงffmpegดูเหมือนจะไม่ให้สิ่งอื่นกว่าเวลาเริ่มต้นและระยะเวลา และmplayerก็ไม่ได้เช่นกัน

คำตอบ:


45

ffmpeg ดูเหมือนจะมีตัวเลือกใหม่-ในเอกสาร :

-to ตำแหน่ง ( อินพุต / เอาต์พุต )
หยุดการเขียนการส่งออกหรือการอ่านการป้อนข้อมูลที่ตำแหน่ง ตำแหน่ง จะต้องเป็นข้อกำหนดระยะเวลาโปรดดู(ffmpeg-utils) ส่วนช่วงเวลาในคู่มือ ffmpeg-utils (1)

-to และ -t เป็นเอกสิทธิ์เฉพาะบุคคลและ -t มีลำดับความสำคัญ

ตัวอย่างคำสั่งที่มีสองรูปแบบเวลา

ffmpeg -i file.mkv -ss 20 -to 40 -c copy file-2.mkv
ffmpeg -i file.mkv -ss 00:00:20 -to 00:00:40 -c copy file-2.mkv

สิ่งนี้ควรสร้างสำเนา (file-2.mkv) ของ file.mkv จากเครื่องหมาย 20 วินาทีไปที่ 40 วินาที


2
Tx ที่ใช้งานได้ดี ฉันพบว่าถ้าฉันไม่ลบcopyส่วนที่เป็นเสียง / วิดีโอออกจากกันฉันจึงลบมันและเพิ่ม-async 1และใช้งานได้อย่างมีเสน่ห์ แน่นอนว่าต้องมีการเข้ารหัสซ้ำดังนั้นการปรับปรุงจะเป็นคำสั่งที่อนุญาตสำหรับcopyแต่ไม่มีปัญหาการซิงค์
user8547

1
เป็นไปได้หรือไม่ที่จะมีหลาย ๆ ช่วงเวลาและพวกเขาจะเข้าร่วมด้วยกันได้หรือไม่? ieffmpeg -i file.mp3 -ss 10 -to 11 -ss 20 -to 21 -ss 30 -to 31 ....
Avner Barr

@AvnerBarr ฉันไม่ทราบว่าเป็นไปได้เพียงอย่างเดียวกับ FFmpeg แต่ฉันรู้ว่ามันเป็นไปได้ด้วย Mencoder ใช้งานได้โดยใช้-toตัวเลือก:ffmpeg -i mmm.mp4 -ss 00:04:04 -to 00:04:35 -c copy output1.mp4 && ffmpeg -i mmm.mp4 -ss 00:05:47 -to 00:06:05 -c copy output2.mp4 && mencoder -ovc copy -oac mp3lame -idx output1.mp4 output2.mp4 -o complete.mp4
user8547

1

หากคุณติดตั้ง PHP ไว้ให้สร้างมันเป็นสคริปต์:

เนื้อหา TimeDiff.php:

<?php
// Create datetime objcects
$dt1 = new DateTime($argv[1]);
$dt2 = new DateTime($argv[2]);

// Conver difference to seconds
$dt3 = $dt2->format('U') - $dt1->format('U');

// echo $dt3."\n";
$h = (int)($dt3 / 3600);
$dt3 %= 3600;
$m = (int)($dt3 / 60);
$dt3 %= 60;
$s = $dt3;

// Dump as H:M:S
echo $h . ":" . $m . ":" . $s;

?>

เนื้อหา audiochop.sh:

#!/bin/bash
INFILE=$1
START=$2
STOP=$3
OUTFILE=$4

OFFSET=`php TimeDiff.php "$START" "$STOP"`

echo "Disecting $INFILE starting from $START to $STOP (duration $OFFSET)"
ffmpeg -ss "$START" -t "$OFFSET" -i "$INFILE" "$OUTFILE"

การใช้งาน:

./audiochop.sh [input.mp3] [startchop] [stopchop] [output.mp3]

ที่ [startchop] และ [stopchop] เป็นทั้งการประทับเวลาแบบสัมบูรณ์จากจุดเริ่มต้นของแทร็ก

NB: สคริปต์อาจต้องมีการปรับเปลี่ยนตามรุ่นของแพลตฟอร์มและอื่น ๆ ...


ดังนั้นคำสั่งจะมีลักษณะเหมือนตัวอย่างต่อไปนี้หรือไม่? audiochop.sh input.mp3 00:01:30 00:01:50 เอาท์พุท. mp3
user8547

ใช่แล้ว
Litch

นี่คือคำสั่งทั้งหมด: ./audiochop.sh input.mp3 00:01:30 00:01:50 เอาท์พุท mp3 ฉันลืมใส่ช่วงเวลาและทับหน้าคำสั่งซึ่งเป็นสาเหตุว่าทำไมมันไม่ได้ การทำงาน
user8547

บังเอิญฉันพบว่าสคริปต์ php / bash นี้ทำงานบนวิดีโอ mp4 ด้วยดังนั้นฉันคิดว่ามันจะใช้ได้กับทุกรูปแบบวิดีโอ
user8547

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