오디오 파일을 여러 개로 나누려면 어떻게합니까?


35

동영상과 같은 것을 찾았습니다.

ffmpeg -i * -c:v libx264 -crf 22 -map 0 -segment_time 1 -g 1 -sc_threshold 0 -force_key_frames "expr:gte(t,n_forced*9)" -f segment output%03d.mp4

나는 그것을 오디오 파일에 사용하려고 시도했지만 첫 번째 오디오 파일에만 실제 오디오가 포함되어 있었고 다른 오디오 파일은 조용했습니다. 누구든지 오디오 파일 또는 이와 동일한 명령을 수행하기 위해 무엇을 수정해야하는지 알고 있습니까?


다른 방법으로이 작업을 수행하려는 경우 달성하려는 작업을보다 자세히 설명하십시오. ffmpeg cmdlines는 기억하기 어렵습니다.

1
@siblynx 질문에서 설명한 바와 같이, 오디오 파일의 1 초마다 새로운 오디오 파일로 분할합니다.
DisplayName

답변:


51

이것은 mp3 파일에서 시도했을 때 저에게 효과적이었습니다.

$ ffmpeg -i somefile.mp3 -f segment -segment_time 3 -c copy out%03d.mp3

-segment_time각 파일 당 원하는 시간은 어디입니까 (초).

참고 문헌


mp3에서 일했습니다 . 나를 위해 실패 M4B 의이 말을 "잘못된 오디오 스트림을. 정확히 하나의 MP3 오디오 스트림이 필요합니다."
vossad01

참고로, 교체 mp3m4a
미하일

40 분짜리 파일을 4 분, 6 분, 12 분, 8 분, 10 분으로 나누는 대신 균일 한 하위 파일로 나누는 경우는 어떻습니까?
isosceleswheel

@isosceleswheel-this-unix.stackexchange.com/questions/94168/…을 살펴 보십시오 .
slm

또한 wav 파일에서도 작동했습니다.
Mário Meyrelles

19

큰 오디오 파일을 길이가 다양한 트랙 세트로 나누려면 다음 명령을 사용할 수 있습니다.

# -to is the end time of the sub-file
ffmpeg -i BIG_FILE -acodec copy -ss START_TIME -to END_TIME LITTLE_FILE

예를 들어, 시작, 종료, 이름이 포함 된이 텍스트 파일을 사용하여 Inception Original Soundtrack의 단일 .opus 파일을 하위 파일로 분할했습니다.

00:00:00 00:01:11 01_half_remembered_dream
00:01:11 00:03:07 02_we_built_our_own_world
00:03:07 00:05:31 03_dream_is_collapsing
00:05:31 00:09:14 04_radical_notion
00:09:14 00:16:58 05_old_souls
00:16:58 00:19:22 06
00:19:22 00:24:16 07_mombasa
00:24:16 00:26:44 08_one_simple_idea
00:26:44 00:31:49 09_dream_within_a_dream
00:31:49 00:41:19 10_waiting_for_a_train
00:41:19 00:44:44 11_paradox
00:44:44 00:49:20 12_time

이 짧은 awk프로그램을 작성하여 텍스트 파일을 읽고 ffmpeg각 줄에서 명령을 작성했습니다 .

{
    # make ffmpeg command string using sprintf
    cmd = sprintf("ffmpeg -i inception_ost.opus -acodec copy -ss %s -to %s %s.opus", $1, $2, $3)

    # execute ffmpeg command with awk's system function
    system(cmd)
}

다음은 python라는 프로그램 의보다 자세한 버전입니다 split.py. 이제 원본 트랙 파일 하위 트랙을 지정하는 텍스트 파일을 명령 줄에서 읽습니다.

import subprocess
import sys


def main():
    """split a music track into specified sub-tracks by calling ffmpeg from the shell"""

    # check command line for original file and track list file
    if len(sys.argv) != 3:
        print 'usage: split <original_track> <track_list>'
        exit(1)

    # record command line args
    original_track = sys.argv[1]
    track_list = sys.argv[2]

    # create a template of the ffmpeg call in advance
    cmd_string = 'ffmpeg -i {tr} -acodec copy -ss {st} -to {en} {nm}.opus'

    # read each line of the track list and split into start, end, name
    with open(track_list, 'r') as f:
        for line in f:
            # skip comment and empty lines
            if line.startswith('#') or len(line) <= 1:
                continue

            # create command string for a given track
            start, end, name = line.strip().split()
            command = cmd_string.format(tr=original_track, st=start, en=end, nm=name)

            # use subprocess to execute the command in the shell
            subprocess.call(command, shell=True)

    return None


if __name__ == '__main__':
    main()

ffmpeg명령 템플릿을 수정하거나 track_list 파일의 각 줄에 더 많은 필드를 추가하여 점점 더 복잡한 호출을 쉽게 구축 할 수 있습니다 .


환상적이다, ! 파이썬 프로그램에서 이것을 실행하는 방법을 알려주십시오. 즉, 오디오를 읽고 싶습니다. 그런 다음 파일의 각 줄에 해당하는 크기의 오디오를 조각으로 나눕니다.
kRazzy R

2
@kRazzyR subprocess.call(command)은 in 의 python아날로그 이며 둘 다 명령을 쉘 에 보낼 수 있습니다 . 나는 당신이 이것에 대해 갈 수있는 한 가지 방법을 보여주는 유연한 구현 을 포함하도록 게시물을 편집 했습니다. system(command)awkffmpegpython
isosceleswheel

1
내 경험상 트랙 # 2의 시작 시간은 트랙 # 1의 종료 시간과 같아야합니다. 즉, 예제 시간은 각 트랙 사이에서 1 초를 건너 뜁니다.
Tim Smith

1
다음은 컴팩트 bash / zsh 버전입니다. 필요에 따라 시간을 편집 한 다음 단어 echo 를 제거하여 실제로 명령을 실행하십시오. source="source audio file.m4a"; i=0; t1=0:00; for end_time in 1:24 5:40 14:48 19:33 35:11 40:00 46:08 51:58 ''; do i=$((i+1)); t0=$t1 t1=$end_time; echo ffmpeg -i "$source" -acodec copy -ss $t0 ${t1:+-to} $t1 $(printf "track%02d.%s" $i ${source##*.}); done
Tim Smith

@TimSmith 감사합니다. 위의 편집 내용을 추가했습니다. 플레이어에 따라 트랙 사이에 작은 딸꾹질이 여전히있을 수 있지만 1을 잘게 자르는 것보다 확실히 들립니다.
isosceleswheel

3

다음 줄은 오디오 파일을 30 초 길이의 여러 파일로 분할합니다.

ffmpeg -i file.wav -f segment -segment_time 30 -c copy parts/output%09d.wav

30 (초)을 원하는 숫자로 변경하십시오.


1

slm의 답변 :

ffmpeg -i somefile.mp3  -f segment -segment_time 3 -c copy out%03d.mp3

추가하지 않으면 나를 위해 작동하지 않습니다 -map 0:

ffmpeg -i somefile.mp3 -map 0 -f segment -segment_time 3 -c copy out%03d.mp3

매핑은 훌륭하지만 -vn을 추가하여 포함 된 그림을 제거하거나 각 세그먼트 (sloooowww)의 그림을 다시 만들려고합니다.
크리스 리드

1

주어진 해결책이 나를 위해 작동하지 않았습니다. 나는 이것이 ffmpeg내 시스템 의 이전 버전 때문이라고 생각 합니다.
어쨌든, 나는 나를 위해 일한 솔루션 을 제공하고 싶었 습니다. 원하는 경우 오디오가 겹치도록 타이머를 사용자 정의 할 수도 있습니다.

Output file #0 does not contain any stream

ffmpeg -i your_audio_file.mp3 -acodec copy -t 00:00:30 -ss 00:00:00 split_audio_file.mp3

오디오 파일을 30 초 단위로 분할


OP의 질문에 답변하지 않으므로 새로운 질문이 순서대로 표시됩니다.
George Udosen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.