Skip to content
Home
Post Code
Jass (Warcraft III)
Wurst
GUI (Warcraft III)
Galaxy (StarCraft II)
GUI (StarCraft II)
C++
Java
Delphi
Text
Search Code
Compare Code
Uploads
Draw
Create New Drawing
View Drawings
Graph
Log in
<pre class="jasscode">#include <stdio.h> #include <stdlib.h> #include <iostream> #include <fstream> #include <sstream> extern <span class="style_string">"C"</span> <span class="style_symbol">{</span> #include <libavcodec <span class="style_symbol">/</span> avcodec.h> #include <libavformat <span class="style_symbol">/</span> avformat.h> #include <libavformat <span class="style_symbol">/</span> avio.h> #include <libswscale <span class="style_symbol">/</span> swscale.h> <span class="style_symbol">}</span> #define log<span class="style_symbol">(</span> msg <span class="style_symbol">)</span> std::wcout << L<span class="style_string">"[ FFmpegRTSP ] "</span> << msg << std::endl << std::flush #define logError<span class="style_symbol">(</span> msg <span class="style_symbol">)</span> std:: wcout << L<span class="style_string">"[ Error ][ FFmpegRTSP ] "</span> << msg << std::endl << std::flush AVFormatContext <span class="style_symbol">*</span> avFormatContext <span class="style_symbol">=</span> nullptr; SwsContext <span class="style_symbol">*</span> swsContext <span class="style_symbol">=</span> nullptr; AVCodecContext <span class="style_symbol">*</span> avCodecContext; AVCodec <span class="style_symbol">*</span> codec <span class="style_symbol">=</span> nullptr; int frameCount <span class="style_symbol">=</span> <span class="style_int">0</span>; void writePPM<span class="style_symbol">(</span> AVFrame <span class="style_symbol">*</span> frameRGB<span class="style_symbol">,</span> int fileSuffix <span class="style_symbol">)</span> <span class="style_symbol">{</span> std::stringstream file_name; std::ofstream output_file; file_name << <span class="style_string">"test"</span> << fileSuffix << <span class="style_string">".ppm"</span>; output_file.open<span class="style_symbol">(</span> file_name.str<span class="style_symbol">(</span><span class="style_symbol">)</span> .c_str<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">)</span> ; output_file << <span class="style_string">"P3 "</span> << avCodecContext <span class="style_symbol">-</span> >width << <span class="style_string">" "</span> << avCodecContext <span class="style_symbol">-</span> >height << <span class="style_string">" 255\n"</span>; <span class="style_keyword">for</span><span class="style_symbol">(</span> int y <span class="style_symbol">=</span> <span class="style_int">0</span>; y < avCodecContext <span class="style_symbol">-</span> >height; y <span class="style_symbol">+</span> <span class="style_symbol">+</span> <span class="style_symbol">)</span> <span class="style_symbol">{</span> <span class="style_keyword">for</span><span class="style_symbol">(</span> int x <span class="style_symbol">=</span> <span class="style_int">0</span>; x < avCodecContext <span class="style_symbol">-</span> >width <span class="style_symbol">*</span> <span class="style_int">3</span>; x <span class="style_symbol">+</span> <span class="style_symbol">+</span> <span class="style_symbol">)</span> <span class="style_symbol">{</span> output_file <<<span class="style_symbol">(</span> int <span class="style_symbol">)</span><span class="style_symbol">(</span> frameRGB <span class="style_symbol">-</span> >data<span class="style_symbol">[</span> <span class="style_int">0</span> <span class="style_symbol">]</span> <span class="style_symbol">+</span> y <span class="style_symbol">*</span> frameRGB <span class="style_symbol">-</span> >linesize<span class="style_symbol">[</span> <span class="style_int">0</span> <span class="style_symbol">]</span> <span class="style_symbol">)</span><span class="style_symbol">[</span> x <span class="style_symbol">]</span> << <span class="style_string">" "</span>; <span class="style_symbol">}</span> <span class="style_symbol">}</span> output_file.close<span class="style_symbol">(</span><span class="style_symbol">)</span> ; <span class="style_symbol">}</span> int main<span class="style_symbol">(</span> int argc<span class="style_symbol">,</span> char <span class="style_symbol">*</span> <span class="style_symbol">*</span> argv <span class="style_symbol">)</span> <span class="style_symbol">{</span> avFormatContext <span class="style_symbol">=</span> avformat_alloc_context<span class="style_symbol">(</span><span class="style_symbol">)</span> ; <span class="style_keyword">if</span><span class="style_symbol">(</span> avformat_open_input<span class="style_symbol">(</span> &avFormatContext<span class="style_symbol">,</span> <span class="style_string">"rtsp: // admin:123456@192.168.2.109:554/h264Preview_01_main"</span><span class="style_symbol">,</span> NULL<span class="style_symbol">,</span> NULL <span class="style_symbol">)</span> <span class="style_symbol">!</span><span class="style_symbol">=</span> <span class="style_int">0</span> <span class="style_symbol">)</span> <span class="style_symbol">{</span> logError<span class="style_symbol">(</span> <span class="style_string">"Failed to open Stream"</span> <span class="style_symbol">)</span> ; <span class="style_keyword">return</span> EXIT_FAILURE; <span class="style_symbol">}</span> <span class="style_keyword">if</span><span class="style_symbol">(</span> avformat_find_stream_info<span class="style_symbol">(</span> avFormatContext<span class="style_symbol">,</span> NULL <span class="style_symbol">)</span> < <span class="style_int">0</span> <span class="style_symbol">)</span> <span class="style_symbol">{</span> <span class="style_keyword">return</span> EXIT_FAILURE; <span class="style_symbol">}</span> int videoStreamIndex <span class="style_symbol">=</span> <span class="style_symbol">-</span> <span class="style_int">1</span>; <span class="style_keyword">for</span><span class="style_symbol">(</span> int i <span class="style_symbol">=</span> <span class="style_int">0</span>; i < avFormatContext <span class="style_symbol">-</span> >nb_streams; i <span class="style_symbol">+</span> <span class="style_symbol">+</span> <span class="style_symbol">)</span> <span class="style_symbol">{</span> <span class="style_keyword">if</span><span class="style_symbol">(</span> avFormatContext <span class="style_symbol">-</span> >streams<span class="style_symbol">[</span> i <span class="style_symbol">]</span> <span class="style_symbol">-</span> >codec <span class="style_symbol">-</span> >codec_type <span class="style_symbol">=</span><span class="style_symbol">=</span> AVMEDIA_TYPE_VIDEO <span class="style_symbol">)</span> <span class="style_symbol">{</span> videoStreamIndex <span class="style_symbol">=</span> i; <span class="style_symbol">}</span> <span class="style_symbol">}</span> <span class="style_keyword">if</span><span class="style_symbol">(</span> videoStreamIndex <span class="style_symbol">=</span><span class="style_symbol">=</span> <span class="style_symbol">-</span> <span class="style_int">1</span> <span class="style_symbol">)</span> <span class="style_symbol">{</span> <span class="style_keyword">return</span> EXIT_FAILURE; <span class="style_symbol">}</span> av_read_play<span class="style_symbol">(</span> avFormatContext <span class="style_symbol">)</span> ; codec <span class="style_symbol">=</span> avcodec_find_decoder<span class="style_symbol">(</span> AV_CODEC_ID_H264 <span class="style_symbol">)</span> ; <span class="style_keyword">if</span><span class="style_symbol">(</span> <span class="style_symbol">!</span>codec <span class="style_symbol">)</span> <span class="style_symbol">{</span> logError<span class="style_symbol">(</span> <span class="style_string">"H264 codec not found, compile FFmpeg with libopenh264 or libx264"</span> <span class="style_symbol">)</span> ; <span class="style_keyword">return</span> EXIT_FAILURE; <span class="style_symbol">}</span> avCodecContext <span class="style_symbol">=</span> avcodec_alloc_context3<span class="style_symbol">(</span> codec <span class="style_symbol">)</span> ; avcodec_get_context_defaults3<span class="style_symbol">(</span> avCodecContext<span class="style_symbol">,</span> codec <span class="style_symbol">)</span> ; avcodec_copy_context<span class="style_symbol">(</span> avCodecContext<span class="style_symbol">,</span> avFormatContext <span class="style_symbol">-</span> >streams<span class="style_symbol">[</span> videoStreamIndex <span class="style_symbol">]</span> <span class="style_symbol">-</span> >codec <span class="style_symbol">)</span> ; <span class="style_keyword">if</span><span class="style_symbol">(</span> avcodec_open2<span class="style_symbol">(</span> avCodecContext<span class="style_symbol">,</span> codec<span class="style_symbol">,</span> NULL <span class="style_symbol">)</span> <span class="style_symbol">!</span><span class="style_symbol">=</span> <span class="style_int">0</span> <span class="style_symbol">)</span> <span class="style_symbol">{</span> logError<span class="style_symbol">(</span> <span class="style_string">"Failed to open codec"</span> <span class="style_symbol">)</span> ; <span class="style_keyword">return</span> EXIT_FAILURE; <span class="style_symbol">}</span> int width <span class="style_symbol">=</span> avCodecContext <span class="style_symbol">-</span> >width; int height <span class="style_symbol">=</span> avCodecContext <span class="style_symbol">-</span> >height; swsContext <span class="style_symbol">=</span> sws_getContext<span class="style_symbol">(</span> width<span class="style_symbol">,</span> height<span class="style_symbol">,</span> avCodecContext <span class="style_symbol">-</span> >pix_fmt<span class="style_symbol">,</span> width<span class="style_symbol">,</span> height<span class="style_symbol">,</span> AV_PIX_FMT_RGB24<span class="style_symbol">,</span> SWS_BICUBIC<span class="style_symbol">,</span> NULL<span class="style_symbol">,</span> NULL<span class="style_symbol">,</span> NULL <span class="style_symbol">)</span> ; AVFrame <span class="style_symbol">*</span> frame <span class="style_symbol">=</span> av_frame_alloc<span class="style_symbol">(</span><span class="style_symbol">)</span> ; frame <span class="style_symbol">-</span> >format <span class="style_symbol">=</span> avCodecContext <span class="style_symbol">-</span> >pix_fmt; frame <span class="style_symbol">-</span> >width <span class="style_symbol">=</span> width; frame <span class="style_symbol">-</span> >height <span class="style_symbol">=</span> height; av_frame_get_buffer<span class="style_symbol">(</span> frame<span class="style_symbol">,</span> <span class="style_int">0</span> <span class="style_symbol">)</span> ; AVFrame <span class="style_symbol">*</span> frameRGB <span class="style_symbol">=</span> av_frame_alloc<span class="style_symbol">(</span><span class="style_symbol">)</span> ; frameRGB <span class="style_symbol">-</span> >format <span class="style_symbol">=</span> AV_PIX_FMT_RGB24; frameRGB <span class="style_symbol">-</span> >width <span class="style_symbol">=</span> width; frameRGB <span class="style_symbol">-</span> >height <span class="style_symbol">=</span> height; av_frame_get_buffer<span class="style_symbol">(</span> frameRGB<span class="style_symbol">,</span> <span class="style_int">0</span> <span class="style_symbol">)</span> ; AVPacket packet; av_init_packet<span class="style_symbol">(</span> &packet <span class="style_symbol">)</span> ; <span class="style_keyword">while</span><span class="style_symbol">(</span> av_read_frame<span class="style_symbol">(</span> avFormatContext<span class="style_symbol">,</span> &packet <span class="style_symbol">)</span> > <span class="style_symbol">=</span> <span class="style_int">0</span> && frameCount < <span class="style_int">1000</span> <span class="style_symbol">)</span> <span class="style_symbol">{</span> <span class="style_keyword">if</span><span class="style_symbol">(</span> packet.stream_index <span class="style_symbol">=</span><span class="style_symbol">=</span> videoStreamIndex <span class="style_symbol">)</span> <span class="style_symbol">{</span> int gotFrame <span class="style_symbol">=</span> <span class="style_int">0</span>; packet.stream_index <span class="style_symbol">=</span> frameCount; int result <span class="style_symbol">=</span> avcodec_decode_video2<span class="style_symbol">(</span> avCodecContext<span class="style_symbol">,</span> frame<span class="style_symbol">,</span> &gotFrame<span class="style_symbol">,</span> &packet <span class="style_symbol">)</span> ; <span class="style_keyword">if</span><span class="style_symbol">(</span> frameCount % <span class="style_int">100</span> <span class="style_symbol">=</span><span class="style_symbol">=</span> <span class="style_int">1</span> && gotFrame <span class="style_symbol">)</span> <span class="style_symbol">{</span> sws_scale<span class="style_symbol">(</span> swsContext<span class="style_symbol">,</span> frame <span class="style_symbol">-</span> >data<span class="style_symbol">,</span> frame <span class="style_symbol">-</span> >linesize<span class="style_symbol">,</span> <span class="style_int">0</span><span class="style_symbol">,</span> avCodecContext <span class="style_symbol">-</span> >height<span class="style_symbol">,</span> frameRGB <span class="style_symbol">-</span> >data<span class="style_symbol">,</span> frameRGB <span class="style_symbol">-</span> >linesize <span class="style_symbol">)</span> ; writePPM<span class="style_symbol">(</span> frameRGB<span class="style_symbol">,</span> frameCount <span class="style_symbol">)</span> ; <span class="style_symbol">}</span> frameCount <span class="style_symbol">+</span> <span class="style_symbol">+</span> ; <span class="style_symbol">}</span> av_free_packet<span class="style_symbol">(</span> &packet <span class="style_symbol">)</span> ; av_init_packet<span class="style_symbol">(</span> &packet <span class="style_symbol">)</span> ; <span class="style_symbol">}</span> av_frame_free<span class="style_symbol">(</span> &frame <span class="style_symbol">)</span> ; av_frame_free<span class="style_symbol">(</span> &frameRGB <span class="style_symbol">)</span> ; av_read_pause<span class="style_symbol">(</span> avFormatContext <span class="style_symbol">)</span> ; avcodec_free_context<span class="style_symbol">(</span> &avCodecContext <span class="style_symbol">)</span> ; avformat_free_context<span class="style_symbol">(</span> avFormatContext <span class="style_symbol">)</span> ; <span class="style_keyword">return</span> EXIT_SUCCESS; <span class="style_symbol">}</span> </pre>
Diesen Code in Original-Formatierung anzeigen
select language
> jass
java
delphi
C++
php
GSL
galaxy
visualBasic
wurst
Text
Markdown
select style
default
bbcode - default
Jasscraft
> jasscraft html
visual
lightweight
lightweightNr
goto line:
Compare with:
text copy window
edit this code
post new code
#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; }