"downloadmp3.txt"라는 텍스트 파일에 다음 형식의 3,000개 URL 목록이 있습니다.
url1,filename1
url2,filename2
...
url3000,filename3000
여기에서 찾은 스니펫을 사용하여 다음 코드를 작성했습니다.
while read p; do
a=$( echo $p | cut -d',' -f1 )
b=$( echo $p | cut -d',' -f2 )
ffmpeg -nostdin -loglevel quiet -stats -i ${a} ${b}.mp3 &
done <downloadmp3.txt
내가 가진 문제는 내 스크립트가 3000개 중 약 500개의 mp3(일부는 전체, 일부는 부분적으로)를 다운로드한 다음 중지된다는 것입니다. 어떤 변경 사항을 적용해야 하는지에 대한 조언을 주시면 감사하겠습니다.
감사해요!
답변1
근본적인 문제가 무엇인지 암시하는 로그를 표시하지 않았지만 본질적으로 동시에 3000개의 프로세스를 시작하고 있으며 이로 인해 예상치 못한 결과(예: 원격 서버가 연결을 종료하는 경우)가 발생할 수 있습니다. &
작업을 백그라운드에 두기 때문에 모든 ffmpeg
프로세스가 실행되면 루프가 매우 빠르게 종료되어야 하지만 그 후에는 3000개의 작업이 실행됩니다.
대신에 다음을 사용하는 것이 좋습니다.암소 비슷한 일종의 영양parallel
다운로드N한 번에 파일.
parallel --dry-run --colsep ',' ffmpeg -nostdin -loglevel error -stats -i {1} -c copy {2}.mp3 :::: downloadmp3.txt
이는 텍스트 파일을 읽고 각 줄을 처리하여 열을 ,
. 그런 다음 열 값을 {1}
, {2}
등 으로 사용할 수 있습니다 .
다음 명령을 병렬로 실행합니다.N동시에 실행되는 작업. 기본적으로NCPU 코어 수와 같습니다.
ffmpeg -nostdin -loglevel error -stats -i url1 -c copy filename1.mp3
ffmpeg -nostdin -loglevel error -stats -i url2 -c copy filename2.mp3
ffmpeg -nostdin -loglevel error -stats -i url3000 -c copy filename3000.mp3
--dry-run
원하는 내용이 인쇄되면 제거하십시오 .
--joblog jobs.txt
로그 파일을 생성하도록 추가할 수 있으며 , 작업이 언제 완료될지에 대한 추정치를 추가 --eta
하거나 --progress
인쇄할 수도 있습니다. 병렬 작업 수는 로 설정할 수 있습니다 -j
.
-c copy
URL이 이미 기존 MP3 파일을 가리키는 경우 일반적으로 오디오 스트림을 다시 인코딩하고 싶지 않으므로 추가했습니다 . 입력이 MP3가 아닌 경우 다시 생략할 수 있습니다 -c copy
. 그리고 오류가 표시되기를 원할 수도 있으므로 quiet
으로 변경했습니다 .error