I'm trying to use FFmpeg with a proxy. The following code works if I comment out:

    setenv("http_proxy", "http://172.0.0.1:3128/";, 1);

The proxy server is an instance of Squid]. I know the proxy server is working because I can use the same URL with VLC without any issues. With the proxy specified, the output from my code is always:

    Proxy path: http://172.0.0.1:3128/
    Metadata could not be retrieved -5 // indicates an IO Error
    setDataSource failed, rc is: -1

I compiled FFmpeg with everything enabled. Can someone explain why this code doesn't work with a proxy?

    #include <stdio.h>
    #include <stdlib.h>
    #include <libavcodec/avcodec.h>
    #include <libavformat/avformat.h>

    const int SUCCESS = 0;
    const int FAILURE = -1;

    typedef struct State {
        AVFormatContext *pFormatCtx;
        int             audio_stream;
        int             video_stream;
        AVStream        *audio_st;
        AVStream        *video_st;
    } State;

    int setDataSource(State** ps, const char* path) {
        State *state = *ps;

        if (state->pFormatCtx) {
            avformat_close_input(&state->pFormatCtx);
        }

        int ret = 0;

if ((ret = avformat_open_input(&state->pFormatCtx, path, NULL, NULL)) != 0) {
            printf("Metadata could not be retrieved %d\n", ret);
            *ps = NULL;
            return FAILURE;
        }

        if (avformat_find_stream_info(state->pFormatCtx, NULL) < 0) {
            printf("Metadata could not be retrieved\n");
            avformat_close_input(&state->pFormatCtx);
            *ps = NULL;
            return FAILURE;
        }

        *ps = state;
        return SUCCESS;
    }

    const char* extractMetadata(State** ps, const char* key) {
        char* value = NULL;

        State *state = *ps;

        if (!state->pFormatCtx) {
            goto fail;
        }

        if (key) {
if (av_dict_get(state->pFormatCtx->metadata, key, NULL, AV_DICT_IGNORE_SUFFIX)) { value = av_dict_get(state->pFormatCtx->metadata, key, NULL, AV_DICT_IGNORE_SUFFIX)->value;
            }
        }

        fail:

        return value;
    }

    int main(void) {
        setenv("http_proxy", "http://172.0.0.1:3128/";, 1);
        unsetenv("no_proxy");

        const char *proxy_path = getenv("http_proxy");

        if (proxy_path) {
            printf("Proxy path: %s\n", proxy_path);
        } else {
            printf("No proxy specified\n");
        }

        av_register_all();
        avformat_network_init();

        State * state = av_mallocz(sizeof(State));

        int ret = setDataSource(&state, "http://<some host>/song.mp3");

        if (ret == 0) {
            printf("setDataSource succedded!\n");
            printf("Artist: %s\n", extractMetadata(&state, "artist"));
        } else {
            printf("setDataSource failed, rc is: %d\n", ret);
        }

        return EXIT_SUCCESS;
    }
_______________________________________________
Libav-user mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/libav-user

Reply via email to