Я новичок в ffmpeg, но теперь у меня есть небольшой хороший конвертер на VB.NET, который создает необработанные фильмы различных выходных форматов для использования в небольших устройствах, которые имеют доступ к SD карте, но не имеют достаточной мощности для декодирования сложного видео.
Из-за того, как он работает при изменении размера и обрезке, мне пришлось кодировать его вручную и создавать параметры. В основном мне нужно знать результирующую ширину и высоту.
У меня есть 2 флажка для опций :-
Preserve Aspect Ratio (X) Fill All Pixels (X)
В качестве входных данных нужны только 4 переменные (1) Ширина исходного видео, (2) Высота исходного видео, (3) Ширина устройства, (4) Высота устройства.
Несмотря на то, что программа предназначена для VB.NET, она может быть легко адаптирована для любого языка.
Dim crop As String = "" ' will build this in ffmpeg format for -s or scale and crop
If cbAspectRatio.Checked = False Then
m_dest_output_w = sz._w
m_dest_output_h = sz._h
' scale to w * h - simple
crop = " -s " & m_dest_output_w & ":" & m_dest_output_h
Else
Dim ratio As Double = CDbl(m_video_width) / CDbl(m_video_height) ' this is aspect ratio of original unsized video
If cbFillPixels.Checked = False Then ' shrink to fit
If sz._w * ratio <= m_video_height Then
m_dest_output_w = sz._w
m_dest_output_h = sz._w / ratio
Else
m_dest_output_h = sz._h
m_dest_output_w = sz._h / ratio
End If
' no cropping just resizing to a non-filled area that fits
crop = " -s " & m_dest_output_w & ":" & m_dest_output_h ' no cropping needed as letterboxed
Else ' expand / fill --- cropping needed
If sz._w * ratio >= m_video_height Then
m_dest_output_w = sz._w
m_dest_output_h = sz._w * ratio
crop = ",crop=" & sz._w & ":" & sz._h & ":0:" & Math.Abs((m_dest_output_h - sz._h)) \ 2
Else
m_dest_output_h = sz._h
m_dest_output_w = sz._h * ratio
crop = ",crop=" & sz._w & ":" & sz._h & ":" & Math.Abs((m_dest_output_w - sz._w)) \ 2 & ":0"
End If
crop = " -vf scale=" & m_dest_output_w & ":" & m_dest_output_h & crop
m_dest_output_w = sz._w
m_dest_output_h = sz._h
End If
End If
Стандартный grep не принимает модификатор ?
, который обычно делает его не жадным.
Но вы можете попробовать опцию -P, которая - если она включена в вашем дистрибутиве - заставит его принимать регексы в стиле Perl:
grep -oP -m1 "(https)[^'\"]+?.mp3" mp3.txt
Если это не сработает, вы можете для вашего конкретного примера включить правую скобку в диапазон, чтобы он не искал дальше скобки:
egrep -o -m1 "(https)[^'\")]+?.mp3" mp3.txt
egrep не поддерживает нежадное сопоставление. Использование режима Perl -P
поможет вам:
grep -o -m1 -P 'https.*?mp3' example.txt
~$ cat example.txt
(https://example.com/pathto/music.mp3)music.mp3
~$ grep -Po "(https)[^'\"].*?mp3" example.txt
https://example.com/pathto/music.mp3