Newest 'x264' Questions - Stack Overflow

http://stackoverflow.com/questions/tagged/x264

Les articles publiés sur le site

  • Why is a file unplayable in Windows Media Player ?

    21 février, par zhang

    I have written some code to generate a MP4 video. This is a simplified version of the code:

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    extern "C"
    {
    #include "libavformat/avformat.h"
    #include "libavutil/frame.h"
    #include "libavcodec/avcodec.h"
    #include "libavutil/imgutils.h"
    }
    using namespace std;
    
    const int output_width = 180;
    const int output_height = 320;
    
    int main(int argc, char **argv)
    {
        AVCodec *output_avc = avcodec_find_encoder_by_name("libx264");
        if (!output_avc)
            abort();
        AVCodecContext *output_cc = avcodec_alloc_context3(output_avc);
        if (!output_cc)
            abort();
    
        output_cc->time_base.num = output_cc->time_base.den = 1;
        output_cc->pix_fmt = AV_PIX_FMT_YUV420P;
    
        output_cc->width = output_width;
        output_cc->height = output_height;
    
        if (avcodec_is_open(output_cc) == 0)
        {
            if (avcodec_open2(output_cc, output_avc, 0) < 0)
                abort();
        }
    
        string outf = "res.mp4";
        AVFormatContext *output_ctx;
        avformat_alloc_output_context2(&output_ctx, NULL, NULL, outf.c_str());
        AVStream *out_stream = avformat_new_stream(output_ctx, 0);
        out_stream->codecpar->codec_id = AV_CODEC_ID_H264;
        out_stream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
        out_stream->codecpar->codec_tag = 0;
        out_stream->codecpar->width = output_width;
        out_stream->codecpar->height = output_height;
        out_stream->codecpar->format = AV_PIX_FMT_YUV420P;
        av_dump_format(output_ctx, 0, outf.c_str(), 1);
        if (!(output_ctx->oformat->flags & AVFMT_NOFILE))
        {
            if (avio_open(&output_ctx->pb, outf.c_str(), AVIO_FLAG_WRITE) < 0)
                abort();
        }
        if (avformat_write_header(output_ctx, NULL) < 0)
            abort();
    
        AVPacket packet;
        AVFrame *frame;
        int fileCount = 0;
    
        for (int i = 0; i < 100; i++)
        {
            frame = av_frame_alloc();
            frame->width = output_width;
            frame->height = output_height;
            frame->format = AV_PIX_FMT_YUV420P;
            if (av_image_alloc(frame->data, frame->linesize, frame->width, frame->height, AV_PIX_FMT_YUV420P, 32) < 0)
                abort();
            frame->pts = 60000 * i;
            frame->pkt_dts = 60000 * i;
            if (avcodec_send_frame(output_cc, frame) < 0)
                abort();
            av_frame_free(&frame);
    
            av_new_packet(&packet, 0);
            while (avcodec_receive_packet(output_cc, &packet) >= 0)
            {
                packet.pos = -1;
                packet.dts = 4500 * fileCount;
                packet.pts = 4500 * fileCount;
                packet.duration = 4500;
                av_write_frame(output_ctx, &packet);
                av_packet_unref(&packet);
                av_new_packet(&packet, 0);
                fileCount++;
            }
            av_packet_unref(&packet);
        }
        avcodec_free_context(&output_cc);
    
        av_write_trailer(output_ctx);
        if (output_ctx && !(output_ctx->oformat->flags & AVFMT_NOFILE))
            avio_close(output_ctx->pb);
        avformat_free_context(output_ctx);
    }
    

    Then, I compiled it (with g++ encode.cpp -lavcodec -lavformat -lavutil -g and libraries are installed via Ubuntu 20.04 apt) and run it. This is the MP4 file I get (2872 bytes, base64 encoded):

    AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAB39tZGF0AAAAAWdkAAys
    2UMCnn4QAAADABAAAAMAIPFCmWAAAAABaOvjyyLAAAABBgX//6rcRem95tlIt5Ys2CDZI+7veDI2
    NCAtIGNvcmUgMTU1IHIyOTE3IDBhODRkOTggLSBILjI2NC9NUEVHLTQgQVZDIGNvZGVjIC0gQ29w
    eWxlZnQgMjAwMy0yMDE4IC0gaHR0cDovL3d3dy52aWRlb2xhbi5vcmcveDI2NC5odG1sIC0gb3B0
    aW9uczogY2FiYWM9MSByZWY9MyBkZWJsb2NrPTE6MDowIGFuYWx5c2U9MHgzOjB4MTEzIG1lPWhl
    eCBzdWJtZT03IHBzeT0xIHBzeV9yZD0xLjAwOjAuMDAgbWl4ZWRfcmVmPTEgbWVfcmFuZ2U9MTYg
    Y2hyb21hX21lPTEgdHJlbGxpcz0xIDh4OGRjdD0xIGNxbT0wIGRlYWR6b25lPTIxLDExIGZhc3Rf
    cHNraXA9MSBjaHJvbWFfcXBfb2Zmc2V0PS0yIHRocmVhZHM9MTAgbG9va2FoZWFkX3RocmVhZHM9
    MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2Nv
    bXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHlyYW1pZD0yIGJfYWRhcHQ9
    MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3ZWlnaHRwPTIga2V5aW50
    PTI1MCBrZXlpbnRfbWluPTEgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVh
    ZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIzLjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5
    IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAAAFliIQAF//+7oK+BTeKk2/DVSCr
    MT4MeFdCVv4gBUyU0LeeB3T/sW2Y2XML/dzzR/1dfS/wWmJ+KGm0PX/sHuGpnyAn2gs5wsYABhgA
    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
    YQAAAAEAAAAATGF2ZjU4LjI5LjEwMA==
    

    And I try to play it in Media Player in Windows 11. It can not play at all and fails with a 0xC00D36C4 error.

    Later I compiled and run the same code in Ubuntu 22.04. This time I got a 3161 byte file (base64 encoded) which can be correctly played in Media Player:

    AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAACF5tZGF0AAAAGWdkAAys
    2UMCnn4QAAADABAAAAMAIPFCmWAAAAAGaOvjyyLAAAACrgYF//+q3EXpvebZSLeWLNgg2SPu73gy
    NjQgLSBjb3JlIDE2MyByMzA2MCA1ZGI2YWE2IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENv
    cHlsZWZ0IDIwMDMtMjAyMSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9w
    dGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1o
    ZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2
    IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0
    X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTEwIGxvb2thaGVhZF90aHJlYWRz
    PTEgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9j
    b21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MyBiX3B5cmFtaWQ9MiBiX2FkYXB0
    PTEgYl9iaWFzPTAgZGlyZWN0PTEgd2VpZ2h0Yj0xIG9wZW5fZ29wPTAgd2VpZ2h0cD0yIGtleWlu
    dD0yNTAga2V5aW50X21pbj0xIHNjZW5lY3V0PTQwIGludHJhX3JlZnJlc2g9MCByY19sb29rYWhl
    YWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAuNjAgcXBtaW49MCBxcG1heD02
    OSBxcHN0ZXA9NCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAAWmWIhAAV//7sz34FN2u2Mv14
    OUV1GW52wf6mv09Y/+Eq5ywBqFdjI7RiQruDqkHmD84Ah+1pD+u+Ju9pbKoJmVnS6c+DhXKzmU8A
    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
    HWRhdGEAAAABAAAAAExhdmY1OC43Ni4xMDA=
    
  • h264 ffmpeg : How to initialize ffmpeg to decode NALs created with x264

    19 février, par Raul Calvo

    I encoded some frames using x264, using x264_encoder_encode() and after that I created AVPackets using a function like this:

    bool PacketizeNals( uint8_t* a_pNalBuffer, int a_nNalBufferSize, AVPacket* a_pPacket )
    {
        if ( !a_pPacket )
    return false;
        a_pPacket->data = a_pNalBuffer;
        a_pPacket->size = a_nNalBufferSize;
        a_pPacket->stream_index = 0;
        a_pPacket->flags = AV_PKT_FLAG_KEY;
    
        a_pPacket->pts = int64_t(0x8000000000000000);
        a_pPacket->dts = int64_t(0x8000000000000000);
    }
    

    I call this function like this:

    x264_nal_t* nals;
    int num_nals = encode_frame(pic, &nals);
    for (int i = 0; i < num_nals; i++)
    {
        AVPacket* pPacket = ( AVPacket* )av_malloc( sizeof( AVPacket ) );
        av_init_packet( pPacket );
        if ( PacketizeNals( nals[i].p_payload, nals[i].i_payload, pPacket ) )
        {
            packets.push_back( pPacket );
        }
    }
    

    Now what I want to do is to decode these AVPackets using avcodec_decode_video2. I think the problem is that I haven't properly initialized the decoder because to encode I used "ultrafast" profile and "zerolatency" tune (x264) and to decode I don't know how to specify these options to ffmpeg.

    In some examples I have read people initialize the decoder using the file where the video is stored, but in this case I have the AVPackets directly.

    What I'm doing to try to decode is:

    avcodec_init();  
    avcodec_register_all();  
    AVCodec* pCodec;  
    pCodec=avcodec_find_decoder(CODEC_ID_H264);  
    AVCodecContext* pCodecContext;  
    pCodecContext=avcodec_alloc_context();  
    avcodec_open(pCodecContext,pCodec);  
    pCodecContext->width = 320;
    pCodecContext->height = 200;
    pCodecContext->extradata = NULL;
    unsigned int nNumPackets = packets.size();
    int frameFinished = 0;
    for ( auto it = packets.begin(); it != packets.end(); it++ )
    {
        AVFrame* pFrame;
        pFrame = avcodec_alloc_frame();
        AVPacket* pPacket = *it;
        int iReturn = avcodec_decode_video2( pCodecContext, pFrame, &frameFinished, pPacket );
    }
    

    But iReturn is always -1.

    Can anyone help me? Sorry if my knowledge in this area is low, I'm new.

  • how to use x264 dll in another project

    7 février, par Hadi Rasekh

    I want to use x264 in my project. There is some line in the code said:

    `/* Application developers planning to link against a shared library version of

    • libx264 from a Microsoft Visual Studio or similar development environment
    • will need to define X264_API_IMPORTS before including this header.
    • This clause does not apply to MinGW, similar development environments, or non
    • Windows platforms. */`

    But I don't get this line: define X264_API_IMPORTS before including this header

    We can create x264 dll by its configuration and make

        ./configure --enable-shared
        make
    

    but I can not use the dll in my Qt Project.

    I can make my own dll (in another code) and use it in the project. But when I start to use x264 dll in my project I get the following error:

        C:\DataHiding\SourceCode2\GUI\DataHiding\mainwindow.cpp:10: error:
        'pulldown_frame_duration' was not declared in this scope
        qDebug() << pulldown_frame_duration[1];
                 ^
    
  • avcodec_find_encoder(AV_CODEC_ID_H264) returns null

    25 janvier, par Monjura Rumi

    I am building an android application which will encode image captured from camera preview and later decode it. I am using ffmpeg library to encode and decode. To build static library with x264 I have used this tutorial. http://dl.dropbox.com/u/22605641/ffmpeg_android/main.html. As a source code of ffmpeg if I use the one downloaded from the link given in tutorial I can built it but can't build library if i use source code downloaded from here git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg. I have built library in ubuntu and using it in windows 7 in Eclipse. As I need only h264 encoder and decoder I have used following code for ffmpeg, slightly modified from tutorial.

    #!/bin/bash
    
    NDK=~/Documents/android-ndk-r8e
    PLATFORM=$NDK/platforms/android-8/arch-arm
    PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
    PREFIX=/home/android-ffmpeg
    
    function build_one
    {
        ./configure --target-os=linux --prefix=$PREFIX \
        --enable-cross-compile \
        --enable-runtime-cpudetect \
        --disable-asm \
        --arch=arm \
        --cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
        --cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
        --disable-stripping \
        --nm=$PREBUILT/bin/arm-linux-androideabi-nm \
        --sysroot=$PLATFORM \
        --enable-nonfree \
        --enable-version3 \
        --disable-everything \
        --enable-gpl \
        --disable-doc \
        --enable-avresample \
        --disable-ffplay \
        --disable-ffserver \
        --enable-ffmpeg \
        --disable-ffprobe \
        --enable-avcodec \
        --enable-libx264 \
        --enable-encoder=libx264 \
        --enable-encoder=libx264rgb \
        --enable-decoder=h263 \
        --enable-decoder=h264 \
        --enable-decoder=svq3 \   
        --enable-zlib \
        --enable-gpl \
        --enable-pic \
        --disable-devices \
        --disable-avdevice \
        --extra-cflags="-I/home/android-ffmpeg/include -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a" \
        --extra-ldflags="-L/home/android-ffmpeg/lib"
    make -j4 install
    $PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o
    $PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib  -soname libffmpeg.so -shared -nostdlib  -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavfilter/libavfilter.a libavresample/libavresample.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog -lx264 --warn-once --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a
    }
    
    build_one
    

    After building library I have been able to build android ndk. A little part of my JNI code is here.

    JNIEXPORT jint JNICALL Java_com_example_testjava_TestjniActivity_initencoder(JNIEnv* env,jobject obj){
    
        av_register_all();
        avcodec_register_all();
        codec = avcodec_find_encoder(AV_CODEC_ID_H264);
        if (!codec) {
          __android_log_write(ANDROID_LOG_INFO, "debug", "not found");                
           return -1;
        }
    .
    .
    .
    }
    

    When I run my java source code that calls initencoder() I get -1 as return value and logcat prints "not found". That means avcodec_find_encoder() returns null and if condition is being ok. I don't know what's wrong. Why this function is returning null? I have searched a lot but did not find any solution that could guide me to right direction. some says to use avcodec_init(). But ndk-build command fails and shows error saying undefined reference to 'avcodec_init()'. I have started with library build because I thought may be I am doing wrong from the first stage. Did I make any mistake in library building like not enabling things that I should? Please help me here. This is kind of urgent for me.

  • How to limit the maximum bitrate of x264 ?

    23 janvier, par Chan Charis

    I want to encode Blu-ray M2TS files with x264, my code is like this:

    enc_ctx = avcodec_alloc_context3(codec);
    enc_ctx->codec_id = AV_CODEC_ID_H264;
    enc_ctx->bit_rate = 20000000;
    

    When a video has a simple scene, such as 10 seconds, its encoding bitrate will be very small, only 1M or 2M bitrate. In order to achieve an average bitrate of 20M/s, the subsequent bitrate will be very large, sometimes reaching 150M/s. , at this time Blu-ray Player will freeze due to high bitrate. I set enc_ctx->rc_max_rate = 50000000; but it seems to have no effect. How can I limit the maximum bitrate?