извлечь аудио из определенных файлов в рабочем каталоге в Perl - PullRequest
2 голосов
/ 19 сентября 2011

По сути, я пытаюсь извлечь аудио из набора загруженных видео с YouTube, имена которых (частично) идентифицированы в файле (mus.txt), который был открыт с помощью ручки TXTFILELIST , TXTFILELIST содержит один 11-символьный идентификатор для видео в каждой строке (например, «dQw4w9WgXcQ»), а загруженный файл имеет форму [title] - [ID] .mp4 (в предыдущем примере «Rick Astley - Никогда не собираюсь поднять тебя - dQw4w9WgXcQ.mp4 ").

#snip...
if ($opt_extract_audio) {
    open(TXTFILELIST, "<", "mus.txt") or die $!;
    my @all_dir_files = `dir /b`;
    my $file_to_convert;
    foreach $file_to_convert (<TXTFILELIST>) {
    my @files = grep("/${file_to_convert}\.mp4$/", @all_dir_files); #the problem line!
    print "files: @files\n";
    foreach $file (@files) {
        system("ffmpeg.exe -i ${file} -vn -y -acodec pcm_s16le -ac 2 ${file}.wav");
     }
     }
#snip...

Остальная часть отсканированного кода работает (я проверил его с несколькими видео, заменив vars, комментируя и т. Д.), Является законным (я использовал прагмы strict и warnings) и, я считаю, не имеет значения, потому что это не имеет никакого отношения к определению любых переменных (кроме $opt_extract_audio), используемых в этом фрагменте. Тем не менее, это один кусочек кода, который доставляет мне проблемы; Я не могу извлечь файлы, идентифицированные в TXTFILELIST из @all_dir_files. Я получил код «проблемной строки» от других специалистов по переполнению стека, но по какой-то причине он не работает.

TL; DR. Я хочу сделать следующее: перечислить все файлы в текущем каталоге (скажем, каталог содержит mus.txt, «Rick Astley - Never Gonna Give You Up-dQw4w9WgXcQ.mp4» и blah.mp4) выберите только идентифицированные файлы (видео Рика Эстли), используя 11-символьный идентификатор в TXTFILELIST (dQw4w9WgXcQ), и извлеките из него аудио. И да, я запускаю этот скрипт в Windows, поэтому я не могу использовать утилиты * nix, такие как ack или find.

Ответы [ 2 ]

3 голосов
/ 19 сентября 2011

Избавьтесь от двойных кавычек вокруг регулярного выражения в функции grep.

2 голосов
/ 19 сентября 2011

Удалите строку

my @all_dir_files = `dir /b`;

И используйте вместо этого этот цикл:

for my $file (<*${file_to_convert}.mp4>) {
    say $file;
    system(...);
}

Приведенный выше <...> является глобусом, также может быть записан glob "${file_to_convert}.mp4".Я думаю, что почти всегда лучше использовать функции perl, а не полагаться на системные вызовы.

Как уже указывалось, "/${file...$/" - это не регулярное выражение, а строка.А так как вы можете использовать выражения с grep, а непустая строка всегда верна, ваш grep по существу ничего не сделает и передаст все значения в ваш массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...