Вверх ↑
Ответов: 2058
Рейтинг: 28
#1: 2021-11-16 15:53:39 ЛС | профиль | цитата
Netspirit писал(а):
Заменить в кодах "Winapi.Windows" на просто "Windows". В остальных подобных случаях - аналогично.

Да помогло, спасибо.

Теперь другая беда. Компилятор ругается на frame_number Вот скрин и код. Как я понимаю это переменная не объявлена и из-за этого компилятор ругается. Правильно?

[spoiler=]

(*
* Copyright (c) 2001 Fabrice Bellard
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*)

program decode_video;

{$APPTYPE CONSOLE}

uses
Windows,
//Winapi.Windows,
SysUtils, //System.SysUtils,
ffmpeg_types,
libavcodec,
libavdevice,
libavfilter,
libavformat,
libavutil,
libpostproc,
libswresample,
libswscale;

const
INBUF_SIZE = 4096;

procedure pgm_save(buf: PByte; wrap, xsize, ysize: Integer; filename: string);
var
f: THandle;
i: Integer;
s: AnsiString;
begin
f := FileCreate(filename);
if f = INVALID_HANDLE_VALUE then
begin
Writeln(ErrOutput, Format('Could not open %s', [filename]));
ExitCode := 1;
Exit;
end;
s := AnsiString(Format('P5'#10'%d %d'#10'%d'#10, [xsize, ysize, 255]));
FileWrite(f, s[1], Length(s));
for i := 0 to ysize - 1 do
FileWrite(f, PByte(PAnsiChar(buf) + i * wrap)^, xsize);
FileClose(f);
end;

function decode(dec_ctx: PAVCodecContext; frame: PAVFrame; pkt: PAVPacket; const filename: string): Boolean;
var
outfile: string;
ret: Integer;
begin
ret := avcodec_send_packet(dec_ctx, pkt);
if ret < 0 then
begin
Writeln(ErrOutput, 'Error sending a packet for decoding');
Result := False;
Exit;
end;

while ret >= 0 do
begin
ret := avcodec_receive_frame(dec_ctx, frame);
if (ret = AVERROR_EAGAIN) or (ret = AVERROR_EOF) then
begin
Result := True;
Exit;
end
else if ret < 0 then
begin
Writeln(ErrOutput, 'Error during decoding');
Result := False;
Exit;
end;

Writeln(Format('saving %sframe %3d', [dec_ctx.frame_number]));
// fflush(stdout);

(* the picture is allocated by the decoder, no need to free it *)
outfile := ChangeFileExt(filename, '');
pgm_save(@frame.data[0], frame.linesize[0], frame.width, frame.height, Format('%s-%d%s', [outfile, dec_ctx.frame_number, ExtractFileExt(filename)]));
end;
Result := True;
end;

function main(): Integer;
var
filename, outfilename: string;
codec: PAVCodec;
parser: PAVCodecParserContext;
c: PAVCodecContext;
f: THandle;
frame: PAVFrame;
inbuf: array [0 .. INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE - 1] of Byte;
data: puint8_t;
data_size: Cardinal;
ret: Integer;
pkt: PAVPacket;
begin
if ParamCount < 2 then
begin
Writeln(Format('Usage: %s <input file> <output file>', [ExtractFileName(ParamStr(0))]));
Result := 1;
Exit;
end;
filename := ParamStr(1);
outfilename := ParamStr(2);

avcodec_register_all();

pkt := av_packet_alloc();
if not Assigned(pkt) then
begin
Result := 1;
Exit;
end;

(* set end of buffer to 0 (this ensures that no overreading happens for damaged MPEG streams) *)
FillChar(inbuf[INBUF_SIZE], AV_INPUT_BUFFER_PADDING_SIZE, 0);

(* find the MPEG1 video decoder *)
codec := avcodec_find_decoder(AV_CODEC_ID_MPEG1VIDEO);
if not Assigned(codec) then
begin
Writeln(ErrOutput, 'Codec not found');
Result := 1;
Exit;
end;

parser := av_parser_init(Ord(codec.id));
if not Assigned(parser) then
begin
Writeln(ErrOutput, 'parser not found');
Result := 1;
Exit;
end;

c := avcodec_alloc_context3(codec);
if not Assigned(c) then
begin
Writeln(ErrOutput, 'Could not allocate video codec context');
Result := 1;
Exit;
end;

(* For some codecs, such as msmpeg4 and mpeg4, width and height
MUST be initialized there because this information is not
available in the bitstream. *)

(* open it *)
if avcodec_open2(c, codec, nil) < 0 then
begin
Writeln(ErrOutput, 'Could not open codec');
Result := 1;
Exit;
end;

f := FileOpen(filename, fmOpenRead);
if f = INVALID_HANDLE_VALUE then
begin
Writeln(ErrOutput, Format('Could not open %s', [filename]));
Result := 1;
Exit;
end;

frame := av_frame_alloc();
if not Assigned(frame) then
begin
Writeln(ErrOutput, 'Could not allocate video frame');
Result := 1;
Exit;
end;

while True do // not feof(f)
begin
(* read raw data from the input file *)
data_size := FileRead(f, inbuf[0], INBUF_SIZE);
if data_size = 0 then
Break;

(* use the parser to split the data into frames *)
data := @inbuf[0];
while data_size > 0 do
begin
ret := av_parser_parse2(parser, c, pkt.data, pkt.size, data, data_size, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);
if ret < 0 then
begin
Writeln(ErrOutput, 'Error while parsing');
Result := 1;
Exit;
end;
Inc(data, ret);
Dec(data_size, ret);

if pkt.size <> 0 then
if not decode(c, frame, pkt, outfilename) then
begin
Result := 1;
Exit;
end;
end;
end;
Result := 0;

(* flush the decoder *)
if not decode(c, frame, nil, outfilename) then
Result := 1;

FileClose(f);

av_parser_close(parser);
avcodec_free_context(c);
av_frame_free(frame);
av_packet_free(pkt);
end;

begin
try
ExitCode := main();
except
on E: Exception do
Writeln(ErrOutput, E.ClassName, ': ', E.Message);
end;

end.
[/spoiler]
Лазарус ошибка 1.png

--- Добавлено в 2021-11-16 16:31:32

Я скачал немного другие исходники и они компилируются. Буду разбираться с новыми исходниками.
карма: 1

0
Редактировалось 1 раз(а), последний 2021-11-16 16:31:32