Как транслировать поток с ffmpeg в отдельном процессе

Не используйте регулярные выражения для синтаксического анализа XML. Он грязный - склонен к взлому и создает хрупкий код. Есть множество вещей, которые могут тривиально вас сбить с толку, например, количество строк - в XML вполне допустимо форматировать элемент:

<calculation name="AB" field="SEC_YLD_1" />

Или:

<calculation
    field="SEC_YLD_1"
    name="AB"
/>

И множество других вариантов - все они семантически идентичны, но ... не будет соответствовать одному и тому же регулярному выражению.

Для вашего примера это поразительно просто, если вы используете синтаксический анализатор. perl имеет XML :: Twig , который может сделать это легко:

Удалить:

#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;

my $twig = XML::Twig -> parsefile ( 'your_file.xml' );

$_ -> delete for $twig -> get_xpath('//ric[@id="AUG03250639E=YBAU"]');

$twig -> set_pretty_print('indented');
$twig -> print;

Примечание - удаляет дубликаты, если они существуют.

Теперь создаем новый - похоже, вы пытаетесь скопировать и изменить - так что:

#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;

my $twig = XML::Twig -> parsefile ( 'your_file.xml' );

#find one to copy - this will just get the first 'ric' element. 
my $ric_to_copy = $twig -> get_xpath('//ric',0); 
#copy it
my $new_ric = $ric_to_copy -> copy;
#alter the new one
$new_ric -> set_att('id', 'BBBBB=YBAU' );
#paste it
$new_ric -> paste ( 'last_child', $ric_to_copy->parent);
$twig -> set_pretty_print('indented');
$twig -> print;

Теперь это читается и печатается в STDOUT - вы можете печатать в конкретный файл:

my ( $output, '>', 'new.xml') or die $!;
print {$output} $twig -> sprint;
close ( $output );
6
12.08.2015, 21:51
1 ответ

Перенаправление стандартного ввода делает свое дело.

Используйте команду типа:ffmpeg... > output.log 2>&1 < /dev/null &.

  • > output.logПеренаправить стандартный вывод в output.log.
  • 2>&1Перенаправить stderr в stdout (, чтобы он оказался в файле журнала, а не в терминале ).
  • < /dev/nullПеренаправить stdin (, который, по мнению ffmpeg, ему нужен )на /dev/null(, что дает пустой поток ).
  • &процесс выполняется в фоновом режиме.
3
27.01.2020, 20:27

Теги

Похожие вопросы