извлечь JPEG из файла SMIL - PullRequest
       15

извлечь JPEG из файла SMIL

0 голосов
/ 19 декабря 2018

Мне нужен мой Perl-скрипт для извлечения JPEG из SMIL-файла.Единственный способ, которым я видел это в Linux - это следующая команда.

xxd -c1 -p wapenc\?T\=mavodi-6-13b-1f-4-7c-4806803 | tr "\n" " " | sed -n -e 's/.*\(ff d8 ff .*\)/\1/p' | xxd -r -p > image.jpeg

Перенос его в системный вызов () не работает.Как правильно включить такую ​​серию команд в perl?

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Согласно стандарту jpeg, есть начало изображения и конец маркера изображения: OxFF OxD8 и 0xFF 0xD9 соответственно.

Так что следующий один лайнер должен работать

perl -0777 -wne '/(\x{FF}\x{D8}.*?\x{FF}\x{D9})/ and print $1' input.smil > thumbnail.jpeg
0 голосов
/ 19 декабря 2018

После тестирования файла примера я преобразовал oneliner из комментариев в правильный сценарий.

Основой сценария является регулярное выражение /(\xff\xd8\xff.*?\x{ff}\x{d9})/s, которое извлекает начало заголовка JPEG до (и включая) конец маркера JPEG \xff\xd9, при этом в нем все еще допускается перевод строки и т. д. (модификатор /s):

#!perl
use strict;
use warnings;

$/ = undef;

my( $filename ) = 'wapenc_T=mavodi-6-13b-1f-4-7c-4806803';
my( $outfilename ) = "$filename-thumbnail.jpeg";

open my $fh, '<:raw', $filename
    or die "Couldn't read '$filename': $!";
my $buffer;
{
    local $/;
    $buffer = <$fh>;
};

open my $output, '>:raw', $outfilename
    or die "Couldn't write to '$outfilename': $!";

if( $buffer =~ /(\xff\xd8\xff.*?\x{ff}\x{d9})/s ) {;
    print $output $1
};
0 голосов
/ 19 декабря 2018

Запишите всю команду во временный файл и выполните ее.

Это позволит вам построить команду из нескольких операторов, если вы захотите, что сделает ее более читабельной.

Или лучше запустить первую команду в читаемом канале.Анализируйте данные самостоятельно, а не обрабатывайте их в конвейере bash до tr и sed, оба из которых довольно слабы по сравнению с Perl.Затем направьте вывод через доступный для записи popen.

Может быть, вы могли бы даже найти модуль, который позволил бы вам обрабатывать то, что делает xxd, так что вам это вообще не нужно.Может быть Данные :: HexDump :: XXD ?

(не смотрел подробно, просто пытался бросить быстрое, надеюсь, полезное преимущество.)

...