Potong file audio menggunakan waktu mulai dan berhenti

34

Saya punya perintah FFmpeg untuk memotong audio:

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

Masalah yang saya miliki dengan perintah ini adalah bahwa opsi -tmembutuhkan durasi (dalam detik) dari 01:43:46 . Saya ingin memotong audio menggunakan waktu mulai / berhenti, misalnya antara 01:43:46 dan 00: 01: 45.02 .

Apakah ini mungkin?

pengguna8547
sumber
1
Jadi, Anda ingin mengekstrak bagian file audio menggunakan waktu mulai dan berhenti, bukan waktu mulai dan durasi, apakah itu benar?
1
@Nasha Itu benar. Saya akan mengedit posting untuk membuatnya lebih jelas.
user8547
1
Saya telah mengubah pertanyaan Anda sesuai dengan itu. Memang ffmpegsepertinya tidak memberikan apa pun selain waktu mulai dan durasi. Dan mplayerjuga tidak.

Jawaban:

45

ffmpeg tampaknya memiliki opsi baru -untuk dalam dokumentasi :

-untuk posisi ( input / output )
Berhenti menulis output atau membaca input pada posisi . Posisi harus merupakan spesifikasi durasi waktu, lihat (ffmpeg-utils) bagian Durasi waktu dalam manual ffmpeg-utils (1).

-untuk dan -t saling eksklusif dan -t memiliki prioritas.

Perintah sampel dengan dua format waktu

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

Ini harus membuat salinan (file-2.mkv) dari file.mkv dari 20 detik hingga 40 detik.

Miati
sumber
2
Tx, itu bekerja dengan baik. Saya menemukan bahwa jika saya tidak menghapus copybagian audio / video tidak sinkron, jadi saya menghapusnya dan menambahkan -async 1dan itu berfungsi seperti pesona. Tentu saja itu memerlukan pengodean ulang, jadi perbaikan akan menjadi perintah yang memungkinkan copytetapi tanpa masalah sinkronisasi.
user8547
1
Apakah mungkin untuk memiliki beberapa interval dan mereka akan digabungkan bersama? yaituffmpeg -i file.mp3 -ss 10 -to 11 -ss 20 -to 21 -ss 30 -to 31 ....
Avner Barr
@AvnerBarr Saya tidak tahu apakah ini hanya mungkin dengan FFmpeg, tapi saya tahu itu mungkin dengan Mencoder. Ini berfungsi, menggunakan -toopsi: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

Jika Anda menginstal PHP, buat skrip:

Isi 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;

?>

konten 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"

Pemakaian:

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

Di mana [startchop] dan [stopchop] adalah cap waktu absolut dari awal trek.

NB: Script mungkin perlu diubah tergantung pada versi platform dll ...

Litch
sumber
Jadi apakah perintahnya terlihat seperti contoh berikut? audiochop.sh input.mp3 00:01:30 00:01:50 output.mp3
user8547
Ya persis seperti itu.
Litch
Ini sebenarnya adalah perintah lengkap: ./audiochop.sh input.mp3 00:01:30 00:01:50 output.mp3 Saya lupa meletakkan tanda titik dan memangkas di depan perintah, oleh karena itu bukan kerja.
user8547
Kebetulan, saya menemukan bahwa skrip php / bash ini juga berfungsi di video mp4, jadi saya menganggap itu akan berfungsi dengan format video apa pun.
user8547
1
Ini harus bekerja dengan format apa pun yang didukung ffmpeg Anda.
Litch