[mythtv-users] My ffmpeg nuvexport module so far
Jonathan Markevich
mythtv at jonandtina.net
Tue Nov 30 17:49:37 UTC 2004
Here (finally) is my module that I have been using with the most success
for exporting MPEG1. Notice that I declare a bunch of KVCD parameters
in here, but am not using them right now. When I try to change the
frame rate it becomes really jerky, though the matrix does make for some
better compression.
I haven't figured out resizing either. It always works quite slowly and
comes out as a green screen with some kind of tearing to it. I left out
the reference to the size in the ffmpeg call. It just does a straight,
non-resized copy.
You need the latest version of ffmpeg for this, otherwise the -aspect
option will fail.
Comments? Improvements?
Have fun!
-------------- next part --------------
#!/usr/bin/perl -w
#Last Updated: 2004.11.28 (jmarkevich)
#
# export::MPG
# Originally export::WMV by Gavin Hurlbut <gjhurlbu at gmail.com>
#
package export::MPG;
use base 'export::ffmpeg';
# Load the myth and nuv utilities, and make sure we're connected to the database
use nuv_export::shared_utils;
use nuv_export::ui;
use mythtv::db;
use mythtv::recordings;
# Load the following extra parameters from the commandline
$cli_args{'a_bitrate|a=i'} = 1; # Audio bitrate
$cli_args{'v_bitrate|v=i'} = 1; # Video bitrate
$cli_args{'height|v_res|h=i'} = 1; # Height
$cli_args{'width|h_res|w=i'} = 1; # Width
sub new {
my $class = shift;
my $self = {
'cli' => qr/\bmpg\b/i,
'name' => 'Export to MPG',
'enabled' => 1,
'errors' => [],
# ffmpeg-related settings
'noise_reduction' => 0,
'deinterlace' => 0,
'crop' => 0,,
# MPG-specific settings
'a_bitrate' => 224,
'v_bitrate' => 1152,
'width' => 352,
'height' => 240,
};
bless($self, $class);
# Initialize and check for ffmpeg
$self->init_ffmpeg();
# Any errors? disable this function
$self->{'enabled'} = 0 if ($self->{'errors'} && @{$self->{'errors'}} > 0);
# Return
return $self;
}
sub gather_settings {
my $self = shift;
# Load the parent module's settings
$self->SUPER::gather_settings();
# Audio Bitrate
if ($Args{'a_bitrate'}) {
$self->{'a_bitrate'} = $Args{'a_bitrate'};
die "Audio bitrate must be > 0\n" unless ($Args{'a_bitrate'} > 0);
}
else {
$self->{'a_bitrate'} = query_text('Audio bitrate?',
'int',
$self->{'a_bitrate'});
}
# Ask the user what video bitrate he/she wants
if ($Args{'v_bitrate'}) {
die "Video bitrate must be > 0\n" unless ($Args{'v_bitrate'} > 0);
$self->{'v_bitrate'} = $Args{'v_bitrate'};
}
elsif ($self->{'multipass'} || !$self->{'vbr'}) {
# make sure we have v_bitrate on the commandline
$self->{'v_bitrate'} = query_text('Video bitrate?',
'int',
$self->{'v_bitrate'});
}
# Ask the user what resolution he/she wants
if ($Args{'width'}) {
die "Width must be > 0\n" unless ($Args{'width'} > 0);
$self->{'width'} = $Args{'width'};
}
else {
$self->{'width'} = query_text('Width?',
'int',
$self->{'width'});
}
if ($Args{'height'}) {
die "Height must be > 0\n" unless ($Args{'height'} > 0);
$self->{'height'} = $Args{'height'};
}
else {
$self->{'height'} = query_text('Height?',
'int',
$self->{'height'});
}
}
sub export {
my $self = shift;
my $episode = shift;
# Load nuv info
load_finfo($episode);
my $kvcd_params = " -intra_matrix "
. "8,9,12,22,26,27,29,34,"
. "9,10,14,26,27,29,34,37,"
. "12,14,18,27,29,34,37,38,"
. "22,26,27,31,36,37,38,40,"
. "26,27,29,36,39,38,40,48,"
. "27,29,34,37,38,40,48,58,"
. "27,29,34,37,38,40,48,58,"
. "34,37,38,40,48,58,69,79"
. " -inter_matrix "
. "16,18,20,22,24,26,28,30,"
. "18,20,22,24,26,28,30,32,"
. "20,22,24,26,28,30,32,34,"
. "22,24,26,30,32,32,34,36,"
. "24,26,28,32,34,34,36,38,"
. "26,28,30,32,34,36,38,40,"
. "28,30,32,34,36,38,42,42,"
. "30,32,34,36,38,40,42,44"
. " -g 24"
. " -r 23.976";
# Build the ffmpeg string
$self->{'ffmpeg_xtra'} = " -b " . $self->{'v_bitrate'}
. " -vcodec mpeg1video"
# these are not quite working yet
#. " " . $kvcd_params
. " -aspect 4:3"
. " -qmin 3 -qmax 13"
. " -ar 44100 "
. " -ab " . $self->{'a_bitrate'}
. " -acodec mp2"
. " -hq"
# . $self->{'width'} . "x" . $self->{'height'} # this is set in ffmpeg.pm module
. " -f vcd";
# Execute the parent method
$self->SUPER::export($episode, ".mpg");
}
1; #return true
# vim:ts=4:sw=4:ai:et:si:sts=4
More information about the mythtv-users
mailing list