#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <sstream>
extern "C" {
#include <libavcodec / avcodec.h>
#include <libavformat / avformat.h>
#include <libavformat / avio.h>
#include <libswscale / swscale.h>
}
#define log( msg ) std::wcout << L"[ FFmpegRTSP ] " << msg << std::endl << std::flush
#define logError( msg ) std:: wcout << L"[ Error ][ FFmpegRTSP ] " << msg << std::endl << std::flush
AVFormatContext * avFormatContext = nullptr;
SwsContext * swsContext = nullptr;
AVCodecContext * avCodecContext;
AVCodec * codec = nullptr;
int frameCount = 0;
void writePPM( AVFrame * frameRGB, int fileSuffix ) {
std::stringstream file_name;
std::ofstream output_file;
file_name << "test" << fileSuffix << ".ppm";
output_file.open( file_name.str() .c_str()) ;
output_file << "P3 " << avCodecContext - >width << " " << avCodecContext - >height
<< " 255\n";
for( int y = 0; y < avCodecContext - >height; y + + ) {
for( int x = 0; x < avCodecContext - >width * 3; x + + ) {
output_file
<<( int )( frameRGB - >data[ 0 ]
+ y * frameRGB - >linesize[ 0 ] )[ x ] << " ";
}
}
output_file.close() ;
}
int main( int argc, char * * argv ) {
avFormatContext = avformat_alloc_context() ;
if( avformat_open_input( &avFormatContext, "rtsp: // admin:123456@192.168.2.109:554/h264Preview_01_main",
NULL, NULL ) != 0 ) {
logError( "Failed to open Stream" ) ;
return EXIT_FAILURE;
}
if( avformat_find_stream_info( avFormatContext, NULL ) < 0 ) {
return EXIT_FAILURE;
}
int videoStreamIndex = - 1;
for( int i = 0; i < avFormatContext - >nb_streams; i + + ) {
if( avFormatContext - >streams[ i ] - >codec - >codec_type == AVMEDIA_TYPE_VIDEO ) {
videoStreamIndex = i;
}
}
if( videoStreamIndex == - 1 ) {
return EXIT_FAILURE;
}
av_read_play( avFormatContext ) ;
codec = avcodec_find_decoder( AV_CODEC_ID_H264 ) ;
if( !codec ) {
logError( "H264 codec not found, compile FFmpeg with libopenh264 or libx264" ) ;
return EXIT_FAILURE;
}
avCodecContext = avcodec_alloc_context3( codec ) ;
avcodec_get_context_defaults3( avCodecContext, codec ) ;
avcodec_copy_context( avCodecContext, avFormatContext - >streams[ videoStreamIndex ] - >codec ) ;
if( avcodec_open2( avCodecContext, codec, NULL ) != 0 ) {
logError( "Failed to open codec" ) ;
return EXIT_FAILURE;
}
int width = avCodecContext - >width;
int height = avCodecContext - >height;
swsContext = sws_getContext( width, height, avCodecContext - >pix_fmt, width,
height, AV_PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL ) ;
AVFrame * frame = av_frame_alloc() ;
frame - >format = avCodecContext - >pix_fmt;
frame - >width = width;
frame - >height = height;
av_frame_get_buffer( frame, 0 ) ;
AVFrame * frameRGB = av_frame_alloc() ;
frameRGB - >format = AV_PIX_FMT_RGB24;
frameRGB - >width = width;
frameRGB - >height = height;
av_frame_get_buffer( frameRGB, 0 ) ;
AVPacket packet;
av_init_packet( &packet ) ;
while( av_read_frame( avFormatContext, &packet ) > = 0 && frameCount < 1000 ) {
if( packet.stream_index == videoStreamIndex ) {
int gotFrame = 0;
packet.stream_index = frameCount;
int result = avcodec_decode_video2( avCodecContext, frame, &gotFrame, &packet ) ;
if( frameCount % 100 == 1 && gotFrame ) {
sws_scale( swsContext, frame - >data, frame - >linesize, 0,
avCodecContext - >height, frameRGB - >data, frameRGB - >linesize ) ;
writePPM( frameRGB, frameCount ) ;
}
frameCount + + ;
}
av_free_packet( &packet ) ;
av_init_packet( &packet ) ;
}
av_frame_free( &frame ) ;
av_frame_free( &frameRGB ) ;
av_read_pause( avFormatContext ) ;
avcodec_free_context( &avCodecContext ) ;
avformat_free_context( avFormatContext ) ;
return EXIT_SUCCESS;
}
-
select language
-
select style
goto line: