주 메뉴 열기

wwiki β

바뀜

FFmpeg 개발

2,299 바이트 추가됨, 2022년 4월 10일 (일) 02:09
avcodec_send_packet
[[FFmpeg]] 명령 사용을 먼저 해 볼 수 있다.
 
== libavformat(lavf) ==
오디오 비디오 포맷 라이브러리 I/O and Muxing(Mux: '''mu'''ltipl'''x'''er, 다중통신장치)/Demuxing Library.
다양한 미디어 컨테이너 형식을 처리하기 위한 라이브러리입니다. 데이터에 액세스하기 위한 여러 프로토콜(예: 파일, tcp, http 및 기타)을 지원하는 I/O모듈이 있습니다. lavf를 사용하기 전에 av_register_all()을 호출하여 컴파일된 모든 muxer, 디먹서 및 프로토콜을 등록해야 합니다. libavformat의 네트워크 기능을 사용하려면 avformat_network_init()를 호출해야 합니다.
libavformat기능을 쿼리하거나 핵심구조체를 할당하는 함수들
===== int avformat_network_init (void) ====='''파라미터''': void  '''반환''': int  
이것은 선택 사항이며 더 이상 권장되지 않습니다.
패킷은 하나의 기본 스트림에 속하는 하나 개 이상의 인코딩 된 프레임을 포함한다. lavf API에서는 파일을 열기 위해서 avformat_open_input()함수를 호출한 후, 단일패킷을 읽기 위해서 av_read_frame()함수를 호출한 후, 마지막으로 avformat_close_input()을 호출해서 정리한다.
===== '''미디어 파일 열기 ====='''  
파일을 열기 위해서는 avformat_open_input()함수에 파일의 url을 전달해야 한다. 다음 코드처럼.<syntaxhighlight lang="c">
const char *url = "file:in.mp3";
</syntaxhighlight>파일 읽기가 끝난 후에 avformat_close_input()을 호출해야 한다. 파일과 관련된 모든 것들을 해제한다.
===== '''열린 파일에서 읽기 =====''' 
열린 AVFormatContext에서 데이터를 읽는 것은 av_read_frame()를 반복적으로 호출하면 된다. 호출할 때마다 인코딩된 데이터인 하나의 AVStream을 포함한 AVPacket(AVPacket.stream_index번호로 식별된다.)을 리턴한다. 데이터를 디코딩하려면 패킷을 libavcodec의 디코딩 함수인 avcodec_send_packet()이나 avcodec_decode_subtitle2()에 직접 전달할 수 있다.
pkt->pts, pkt->dts and pkt->duration은 항상 AVStream.time_base 단위로 정확한 값들이 설정된다. (만약 포맷이 그걸 제공하지 않으면 추측된다.) 비디오 프레임이 B-frames이면 pkt->ptsd은 AV_NOPTS_VALUE이다. 그래서 페이로드의 압축을 해제하지 않으면 pkt->dts를 사용하는 것이 좋다.
<br />====== av_packet_unref ======패킷을 정리한다. '''파라미터''' * AVPacket * pkt 패킷이 참조하는 버퍼를 참조해제하고 나머지 패킷필드를 기본값으로 재설정한다. 
== libavcodec ==
Encoding/Decoding Library.
ret = av_parser_parse2(s, avctx, &pkt->data, &pkt->size, data, data_size, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);
==== Core functions/structures. == avcodec_send_packet ======'''파라미터''' * AVCodecContext * avctx 코덱 콘텍스트* const AVPacket * avpkt [in]  <blockquote>입력값. 일반적으로 단일 비디오 프레임이거나 몇 개의 완성된 오디오 프레임들이다. 패킷의 소유권은 호출한 곳에 유지되고, 디코더는 그 패킷의 값을 변경하지 않을 것이다. 디코더는 패킷 데이터에 대한 참조를 생성할 수 있다.(혹은 레퍼런스 카운트되지 않는다면 복사할 것이다.) 오래된 함수들과 다르게 패킷은 항상 전체가 소비되고, 패킷이 어떤 오디오 코덱처럼 여러 프레임들을 포함한다면 avcodec_receive_frame()함수를 여러 번 호출해야 할 것이다. avpkt가 NULL이거나 혹은 avpkt의 data가 NULL이거나 size가 0인 경우에는 스트림의 끝이라는 신호인 flush pakcet으로 간주된다. 처음 flush packet을 보내는 것은 성공을 반환한다. 다시 보내는 것은 불필요하고 AVERROR_EOF를 리턴할 것이다. 만약 디코더가 여전히 버퍼된 프레임을 가지고 있다면, flush packet을 보낸 후에 리턴한다.</blockquote>'''반환''': int<blockquote>성공이면 0, 그렇지 않으면 음수인 에러코드를 리턴한다. </blockquote>원시 패킷 데이터를 디코더에 입력으로 제공한다.  내부적으로 이 함수를 호출하면 각 패킷의 디코딩하는 것에 영향을 미치는 AVCodecContext의 관련된 필드를 복사할 것이다. 그리고 실제로 패킷이 디코딩되었을 때 적용한다.  '''경고'''  입력버퍼인 avpkt->data는 어떤 최적화된 bitstream reader는 끝을 넘어서 한번에 32비트나 64비트를 읽기 때문에 실제 읽은 바이트보다 AV_INPUT_BUFFER_PADDING_SIZE가 커야 한다.  동일한 AVCodecContext를 avcodec_decode_video2()와 같은 오래된 함수와 혼용하지 마라. 기대하지 않았던 값을 리턴할 것이다.
===== Modules ====='''주의'''
====== AVPacket ======'''void av_init_packet AVCodecContext는 디코더에 전달하기 전에 avcodec_open2(AVPacket *pkt)'''함수를 호출하여 열어야 한다.
기본값으로 패킷의 선택적 필드를 초기화한다==== Core functions/structures. ====
이것은 별도로 초기화해야하는 데이터 및 크기 멤버를 건드리지 않습니다.<br />===== Modules =====
======[[AVPacket]]======
== 예제 ==
== 각주 ==
<references />
[[분류:FFMPEG]]
편집
2,431