从SMIL文件中提取jpeg

时间:2018-12-19 14:52:12

标签: linux perl mms hexdump

我需要我的perl脚本从SMIL文件中提取jpeg。我所看到的在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

将其包装在system()调用中不起作用。将这样一系列命令合并到perl中的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

在对示例文件进行测试之后,我将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
};

答案 1 :(得分:0)

将整个命令写入临时文件并执行。

如果愿意,它可以使您在多条语句中构建命令,从而使命令更具可读性。

或者更好的是,在可读管道中运行第一个命令。自己解析数据,而不是在bash管道中将其种植到tr sed中,与perl相比,这两个数据都非常薄弱。然后将输出定向到可写的popen。

也许您甚至可以找到一个模块,该模块可以让您处理xxd所做的事情,从而根本不需要它。也许Data::HexDump::XXD

(没有仔细看,只是想扔出一条快速的,希望有用的线索。)

答案 2 :(得分:-1)

根据jpeg标准,图像的开始和图像标记的结束分别为OxFF OxD80xFF 0xD9

因此以下一种班轮应该可以工作

perl -0777 -wne '/(\x{FF}\x{D8}.*?\x{FF}\x{D9})/ and print $1' input.smil > thumbnail.jpeg