Newest 'libx264' Questions - Stack Overflow
Les articles publiés sur le site
-
How to encode h.264 with libavcodec/x264 ?
23 décembre 2016, par szatmaryI am attempting to encode video using libavcodec/libavformat. Audio works great, but when I try to encode video I get the following errors:
[libx264 @ 0x10182a000]broken ffmpeg default settings detected [libx264 @ 0x10182a000]use an encoding preset (vpre)
easy to fix using the command line ffmpeg, but I am trying to do this in C. my options are
AVStream *pVideoOutStream = av_new_stream(pOutFormatCtx, 0); AVCodecContext *pVideoOutCodecCtx = pVideoOutStream->codec; pVideoOutCodecCtx->codec_id = CODEC_ID_H264; pVideoOutCodecCtx->codec_type = CODEC_TYPE_VIDEO; pVideoOutCodecCtx->bit_rate = pVideoInCodecCtx->bit_rate; pVideoOutCodecCtx->width = pVideoInCodecCtx->width; pVideoOutCodecCtx->height = pVideoInCodecCtx->height; pVideoOutCodecCtx->pix_fmt = pVideoInCodecCtx->pix_fmt; pVideoOutCodecCtx->sample_rate = pVideoInCodecCtx->sample_rate; pVideoOutCodecCtx->gop_size = 30;
but avcodec_open() fails.
What other values do I need to set to make x264 happy?
-
How to wrap a C library parameter ?(Creating x264 .Net wrapper)
6 décembre 2016, par Rellaso in dll we have
x264_param_t
structure\object and a function for its setting upx264_param_apply_profile
. in C we use such code to set it upx264_param_t param; x264_param_default_preset(¶m, "veryfast", "zerolatency"); param.i_threads = 1; param.i_width = width; param.i_height = height; param.i_fps_num = fps; param.i_fps_den = 1; // Intra refres: param.i_keyint_max = fps; param.b_intra_refresh = 1; //Rate control: param.rc.i_rc_method = X264_RC_CRF; param.rc.f_rf_constant = 25; param.rc.f_rf_constant_max = 35; //For streaming: param.b_repeat_headers = 1; param.b_annexb = 1; x264_param_apply_profile(¶m, "baseline");
I want to create wrapper for such.. thing. so I have libx264.dll and visual studio 2010 pro.
How can I create .Net C# wrapper for it?
I am a beginner in P\Invoke stuff so I do not get a lot of it...
what I want to achive is is frame by frame level of working with x264... By now I need only encoding parts... And all needed sample code for doing it in C is in How does one encode a series of images into H264 using the x264 C API? . So I need to write a wrapper only for stuff mentioned there... So I am asking - how to create a wrapper on Parameter and on Function that sets up thap param. And I would love to see how to call that wrapper back from c#. So if you could provide any code in support I'd be glad to see it.
-
How to wrap a C library parameter ?(Creating x264 .Net wrapper)
6 décembre 2016, par Rellaso in dll we have
x264_param_t
structure\object and a function for its setting upx264_param_apply_profile
. in C we use such code to set it upx264_param_t param; x264_param_default_preset(¶m, "veryfast", "zerolatency"); param.i_threads = 1; param.i_width = width; param.i_height = height; param.i_fps_num = fps; param.i_fps_den = 1; // Intra refres: param.i_keyint_max = fps; param.b_intra_refresh = 1; //Rate control: param.rc.i_rc_method = X264_RC_CRF; param.rc.f_rf_constant = 25; param.rc.f_rf_constant_max = 35; //For streaming: param.b_repeat_headers = 1; param.b_annexb = 1; x264_param_apply_profile(¶m, "baseline");
I want to create wrapper for such.. thing. so I have libx264.dll and visual studio 2010 pro.
How can I create .Net C# wrapper for it?
I am a beginner in P\Invoke stuff so I do not get a lot of it...
what I want to achive is is frame by frame level of working with x264... By now I need only encoding parts... And all needed sample code for doing it in C is in How does one encode a series of images into H264 using the x264 C API? . So I need to write a wrapper only for stuff mentioned there... So I am asking - how to create a wrapper on Parameter and on Function that sets up thap param. And I would love to see how to call that wrapper back from c#. So if you could provide any code in support I'd be glad to see it.
-
FFMPEG RTSP stream to MPEG4/H264 file using libx264
4 décembre 2016, par PhiHeyo folks,
I'm attempting to transcode/remux an RTSP stream in H264 format into a MPEG4 container, containing just the H264 video stream. Basically, webcam output into a MP4 container.
I can get a poorly coded MP4 produced, using this code:
// Variables here for demo AVFormatContext * video_file_output_format = nullptr; AVFormatContext * rtsp_format_context = nullptr; AVCodecContext * video_file_codec_context = nullptr; AVCodecContext * rtsp_vidstream_codec_context = nullptr; AVPacket packet = {0}; AVStream * video_file_stream = nullptr; AVCodec * rtsp_decoder_codec = nullptr; int errorNum = 0, video_stream_index = 0; std::string outputMP4file = "D:\\somemp4file.mp4"; // begin AVDictionary * opts = nullptr; av_dict_set(&opts, "rtsp_transport", "tcp", 0); if ((errorNum = avformat_open_input(&rtsp_format_context, uriANSI.c_str(), NULL, &opts)) < 0) { errOut << "Connection failed: avformat_open_input failed with error " << errorNum << ":\r\n" << ErrorRead(errorNum); TacticalAbort(); return; } rtsp_format_context->max_analyze_duration = 50000; if ((errorNum = avformat_find_stream_info(rtsp_format_context, NULL)) < 0) { errOut << "Connection failed: avformat_find_stream_info failed with error " << errorNum << ":\r\n" << ErrorRead(errorNum); TacticalAbort(); return; } video_stream_index = errorNum = av_find_best_stream(rtsp_format_context, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0); if (video_stream_index < 0) { errOut << "Connection in unexpected state; made a connection, but there was no video stream.\r\n" "Attempts to find a video stream resulted in error " << errorNum << ": " << ErrorRead(errorNum); TacticalAbort(); return; } rtsp_vidstream_codec_context = rtsp_format_context->streams[video_stream_index]->codec; av_init_packet(&packet); if (!(video_file_output_format = av_guess_format(NULL, outputMP4file.c_str(), NULL))) { TacticalAbort(); throw std::exception("av_guess_format"); } if (!(rtsp_decoder_codec = avcodec_find_decoder(rtsp_vidstream_codec_context->codec_id))) { errOut << "Connection failed: connected, but avcodec_find_decoder returned null.\r\n" "Couldn't find codec with an AV_CODEC_ID value of " << rtsp_vidstream_codec_context->codec_id << "."; TacticalAbort(); return; } video_file_format_context = avformat_alloc_context(); video_file_format_context->oformat = video_file_output_format; if (strcpy_s(video_file_format_context->filename, sizeof(video_file_format_context->filename), outputMP4file.c_str())) { errOut << "Couldn't open video file: strcpy_s failed with error " << errno << "."; std::string log = errOut.str(); TacticalAbort(); throw std::exception("strcpy_s"); } if (!(video_file_encoder_codec = avcodec_find_encoder(video_file_output_format->video_codec))) { TacticalAbort(); throw std::exception("avcodec_find_encoder"); } // MARKER ONE if (!outputMP4file.empty() && !(video_file_output_format->flags & AVFMT_NOFILE) && (errorNum = avio_open2(&video_file_format_context->pb, outputMP4file.c_str(), AVIO_FLAG_WRITE, nullptr, &opts)) < 0) { errOut << "Couldn't open video file \"" << outputMP4file << "\" for writing : avio_open2 failed with error " << errorNum << ": " << ErrorRead(errorNum); TacticalAbort(); return; } // Create stream in MP4 file if (!(video_file_stream = avformat_new_stream(video_file_format_context, video_file_encoder_codec))) { TacticalAbort(); return; } AVCodecContext * video_file_codec_context = video_file_stream->codec; // MARKER TWO // error -22/-21 in avio_open2 if this is skipped if ((errorNum = avcodec_copy_context(video_file_codec_context, rtsp_vidstream_codec_context)) != 0) { TacticalAbort(); throw std::exception("avcodec_copy_context"); } //video_file_codec_context->codec_tag = 0; /* // MARKER 3 - is this not needed? Examples suggest not. if ((errorNum = avcodec_open2(video_file_codec_context, video_file_encoder_codec, &opts)) < 0) { errOut << "Couldn't open video file codec context: avcodec_open2 failed with error " << errorNum << ": " << ErrorRead(errorNum); std::string log = errOut.str(); TacticalAbort(); throw std::exception("avcodec_open2, video file"); }*/ //video_file_format_context->flags |= AVFMT_FLAG_GENPTS; if (video_file_format_context->oformat->flags & AVFMT_GLOBALHEADER) { video_file_codec_context->flags |= CODEC_FLAG_GLOBAL_HEADER; } if ((errorNum = avformat_write_header(video_file_format_context, &opts)) < 0) { errOut << "Couldn't open video file: avformat_write_header failed with error " << errorNum << ":\r\n" << ErrorRead(errorNum); std::string log = errOut.str(); TacticalAbort(); return; }
However, there are several issues:
- I can't pass any x264 options to the output file. The output H264 matches the input H264's profile/level - switching cameras to a different model switches H264 level.
- The timing of the output file is off, noticeably.
- The duration of the output file is off, massively. A few seconds of footage becomes hours, although playtime doesn't match. (FWIW, I'm using VLC to play them.)
Passing x264 options
If I manually increment PTS per packet, and set DTS equal to PTS, it plays too fast, ~2-3 seconds' worth of footage in one second playtime, and duration is hours long. The footage also blurs past several seconds, about 10 seconds' footage in a second.
If I let FFMPEG decide (with or without GENPTS flag), the file has a variable frame rate (probably as expected), but it plays the whole file in an instant and has a long duration too (over forty hours for a few seconds). The duration isn't "real", as the file plays in an instant.
At Marker One, I try to set the profile by passing options to
avio_open2
. The options are simply ignored by libx264. I've tried:av_dict_set(&opts, "vprofile", "main", 0); av_dict_set(&opts, "profile", "main", 0); // error, missing '(' // FF_PROFILE_H264_MAIN equals 77, so I also tried av_dict_set(&opts, "vprofile", "77", 0); av_dict_set(&opts, "profile", "77", 0);
It does seem to read the profile setting, but it doesn't use them. At Marker Two, I tried to set it after the
avio_open2
, beforeavformat_write_header
.// I tried all 4 av_dict_set from earlier, passing it to avformat_write_header. // None had any effect, they weren't consumed. av_opt_set(video_file_codec_context, "profile", "77", 0); av_opt_set(video_file_codec_context, "profile", "main", 0); video_file_codec_context->profile = FF_PROFILE_H264_MAIN; av_opt_set(video_file_codec_context->priv_data, "profile", "77", 0); av_opt_set(video_file_codec_context->priv_data, "profile", "main", 0);
Messing with privdata made the program unstable, but I was trying anything at that point. I'd like to solve issue 1 with passing settings, since I imagine it'd bottleneck any attempt to solve issues 2 or 3.
I've been fiddling with this for the better part of a month now. I've been through dozens of documentation, Q&As, examples. It doesn't help that quite a few are outdated.
Any help would be appreciated.
Cheers
-
ffpyplayer with libx264 error : cannot locate symbol "avio_seek" referenced by "player.so"
2 décembre 2016, par Gerasimov MikhailKivy's ffpyplayer 3.2 can be built with python-for-android's old toolchain recipe. I also want ffpyplayer to open more video formats so I try to add libx264 for ffmpeg2 recipe.
I created separate recipe for libx264, here's how I build lib:
try ./configure \ --cross-prefix=arm-linux-androideabi- \ --sysroot="$NDKPLATFORM" \ --host=arm-linux \ --enable-pic \ --disable-asm \ --disable-cli \ --disable-opencl \ --enable-shared \ --prefix=$BUILD_x264
Here's main part where I add libx264 to ffmpeg2:
debug "Activate flags for x264 / ffmpeg2" x264_CFLAGS="-I$BUILD_x264/include/" x264_LDFLAGS="-L$BUILD_x264/lib/ -Wl,-soname,libx264.so"
Everything compiles fine, but I'm getting error when trying to use ffpyplayer on Android device:
ffpyplayer - ImportError: dlopen failed: cannot locate symbol "avio_seek" referenced by "player.so"
Any idea what can it be?
I have no knowledges in compiling libs so I would be grateful if you suggest me way where to go to find reason of this error.