curl / Mailing Lists / curl-library / Single Mail
Buy commercial curl support from WolfSSL. We help you work out your issues, debug your libcurl applications, use the API, port to new platforms, add new features and more. With a team lead by the curl founder himself.

Re: curl-library Digest, Vol 174, Issue 10

From: Nishad DESHMUKH via curl-library <curl-library_at_cool.haxx.se>
Date: Fri, 14 Feb 2020 16:20:31 +0530

how to store that bitstream as video file .if i want to display that
bitstream as video what are the ways you can suggest ?

On Fri, 14 Feb 2020 at 15:50, <curl-library-request_at_cool.haxx.se> wrote:

> Send curl-library mailing list submissions to
> curl-library_at_cool.haxx.se
>
> To subscribe or unsubscribe via the World Wide Web, visit
> https://cool.haxx.se/cgi-bin/mailman/listinfo/curl-library
> or, via email, send a message with subject or body 'help' to
> curl-library-request_at_cool.haxx.se
>
> You can reach the person managing the list at
> curl-library-owner_at_cool.haxx.se
>
> When replying, please edit your Subject line so it is more specific
> than "Re: Contents of curl-library digest..."
>
>
> Today's Topics:
>
> 1. rtsp curl code not playing video (Nishad DESHMUKH)
> 2. Re: rtsp curl code not playing video (Dan Fandrich)
>
>
> ----------------------------------------------------------------------
>
> Message: 1
> Date: Fri, 14 Feb 2020 14:39:16 +0530
> From: Nishad DESHMUKH <nishaddeshmukh94_at_gmail.com>
> To: curl-library_at_cool.haxx.se
> Subject: rtsp curl code not playing video
> Message-ID:
> <CANU4-RTOr6oqk7h3KbsMwiwFHcc057=
> ZmtPcZhBkFt+GJuwdiQ_at_mail.gmail.com>
> Content-Type: text/plain; charset="utf-8"
>
> after compilation and run the link video not played . my input was
>
> INPUT TO PROGRAM:
> ./a.out rtsp://freja.hiof.no:1935/rtplive/definst/hessdalen03.stream/
>
> OUTPUT :
>
> RTSP request V1.0
> Project web site: https://github.com/BackupGGCode/rtsprequest
> Requires curl V7.20 or greater
>
> curl V7.54.0 loaded
>
> RTSP: OPTIONS rtsp://
> freja.hiof.no:1935/rtplive/definst/hessdalen03.stream/
> RTSP/1.0
> <http://freja.hiof.no:1935/rtplive/definst/hessdalen03.stream/RTSP/1.0>
> 200 OK
> Server: Wowza Media Server 3.1.1 build1479
> Cache-Control: no-cache
> Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD,
> GET_PARAMETER
> Cseq: 1
> Supported: play.basic, con.persistent
>
>
> RTSP: DESCRIBE rtsp://
> freja.hiof.no:1935/rtplive/definst/hessdalen03.stream/
> Writing SDP to 'video.sdp'
> RTSP/1.0 200 OK
> Server: Wowza Media Server 3.1.1 build1479
> Cache-Control: no-cache
> Expires: Fri, 14 Feb 2020 09:57:51 CET
> Cseq: 2
> Content-Length: 812
> Content-Base: rtsp://
> freja.hiof.no:1935/rtplive/definst/hessdalen03.stream/
> Date: Fri, 14 Feb 2020 09:57:51 CET
> Content-Type: application/sdp
> Session: 1675774146;timeout=60
>
>
> RTSP: SETUP rtsp://
> freja.hiof.no:1935/rtplive/definst/hessdalen03.stream//trackID=2
> TRANSPORT RTP/AVP;unicast;client_port=1234-1235
> RTSP/1.0 200 OK
> Server: Wowza Media Server 3.1.1 build1479
> Cache-Control: no-cache
> Expires: Fri, 14 Feb 2020 09:57:51 CET
> Cseq: 3
> Transport: RTP/AVP;unicast;client_port=1234-1235;source=freja.hiof.no
> ;server_port=7174-7175;ssrc=6CC88579
> Date: Fri, 14 Feb 2020 09:57:51 CET
> Session: 1675774146;timeout=60
>
>
> RTSP: PLAY rtsp://freja.hiof.no:1935/rtplive/definst/hessdalen03.stream//
> RTSP/1.0
> <http://freja.hiof.no:1935/rtplive/definst/hessdalen03.stream//RTSP/1.0>
> 200 OK
> RTP-Info: url=trackID=1;seq=1;rtptime=3861933024,url=rtsp://
>
> freja.hiof.no:1935/rtplive/definst/hessdalen03.stream//trackID=2;seq=1;rtptime=1335544388
> Server: Wowza Media Server 3.1.1 build1479
> Cache-Control: no-cache
> Cseq: 4
> Range: npt=now-
> Session: 1675774146;timeout=60
>
> Playing video, press any key to stop ...
>
> RTSP: TEARDOWN rtsp://
> freja.hiof.no:1935/rtplive/definst/hessdalen03.stream//
> RTSP/1.0 403 Forbidden
> Server: Wowza Media Server 3.1.1 build1479
> Cseq: 5
>
> SOURCE CODE :
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
>
> #if defined (WIN32)
> # include <conio.h> /* _getch() */
> #else
> # include <termios.h>
> # include <unistd.h>
>
> static int _getch(void)
> {
> struct termios oldt, newt;
> int ch;
> tcgetattr(STDIN_FILENO, &oldt);
> newt = oldt;
> newt.c_lflag &= ~( ICANON | ECHO);
> tcsetattr(STDIN_FILENO, TCSANOW, &newt);
> ch = getchar();
> tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
> return ch;
> }
> #endif
>
> #include <curl/curl.h>
>
> #define VERSION_STR "V1.0"
>
> /* error handling macros */
> #define my_curl_easy_setopt(A, B, C) \
> res = curl_easy_setopt((A), (B), (C)); \
> if(res != CURLE_OK) \
> fprintf(stderr, "curl_easy_setopt(%s, %s, %s) failed: %d\n", \
> #A, #B, #C, res);
>
> #define my_curl_easy_perform(A) \
> res = curl_easy_perform(A); \
> if(res != CURLE_OK) \
> fprintf(stderr, "curl_easy_perform(%s) failed: %d\n", #A, res);
>
>
> /* send RTSP OPTIONS request */
> static void rtsp_options(CURL *curl, const char *uri)
> {
> CURLcode res = CURLE_OK;
> printf("\nRTSP: OPTIONS %s\n", uri);
> my_curl_easy_setopt(curl, CURLOPT_RTSP_STREAM_URI, uri);
> my_curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST,
> (long)CURL_RTSPREQ_OPTIONS);
> my_curl_easy_perform(curl);
> }
>
>
> /* send RTSP DESCRIBE request and write sdp response to a file */
> static void rtsp_describe(CURL *curl, const char *uri,
> const char *sdp_filename)
> {
> CURLcode res = CURLE_OK;
> FILE *sdp_fp = fopen(sdp_filename, "wb");
> printf("\nRTSP: DESCRIBE %s\n", uri);
> if(sdp_fp == NULL) {
> fprintf(stderr, "Could not open '%s' for writing\n", sdp_filename);
> sdp_fp = stdout;
> }
> else {
> printf("Writing SDP to '%s'\n", sdp_filename);
> }
> my_curl_easy_setopt(curl, CURLOPT_WRITEDATA, sdp_fp);
> my_curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST,
> (long)CURL_RTSPREQ_DESCRIBE);
> my_curl_easy_perform(curl);
> my_curl_easy_setopt(curl, CURLOPT_WRITEDATA, stdout);
> if(sdp_fp != stdout) {
> fclose(sdp_fp);
> }
> }
>
> /* send RTSP SETUP request */
> static void rtsp_setup(CURL *curl, const char *uri, const char *transport)
> {
> CURLcode res = CURLE_OK;
> printf("\nRTSP: SETUP %s\n", uri);
> printf(" TRANSPORT %s\n", transport);
> my_curl_easy_setopt(curl, CURLOPT_RTSP_STREAM_URI, uri);
> my_curl_easy_setopt(curl, CURLOPT_RTSP_TRANSPORT, transport);
> my_curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST,
> (long)CURL_RTSPREQ_SETUP);
> my_curl_easy_perform(curl);
> }
>
>
> /* send RTSP PLAY request */
> static void rtsp_play(CURL *curl, const char *uri, const char *range)
> {
> CURLcode res = CURLE_OK;
> printf("\nRTSP: PLAY %s\n", uri);
> my_curl_easy_setopt(curl, CURLOPT_RTSP_STREAM_URI, uri);
> my_curl_easy_setopt(curl, CURLOPT_RANGE, range);
> my_curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, (long)CURL_RTSPREQ_PLAY);
> my_curl_easy_perform(curl);
>
> /* switch off using range again */
> my_curl_easy_setopt(curl, CURLOPT_RANGE, NULL);
> }
>
>
> /* send RTSP TEARDOWN request */
> static void rtsp_teardown(CURL *curl, const char *uri)
> {
> CURLcode res = CURLE_OK;
> printf("\nRTSP: TEARDOWN %s\n", uri);
> my_curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST,
> (long)CURL_RTSPREQ_TEARDOWN);
> my_curl_easy_perform(curl);
> }
>
>
> /* convert url into an sdp filename */
> static void get_sdp_filename(const char *url, char *sdp_filename,
> size_t namelen)
> {
> const char *s = strrchr(url, '/');
> strcpy(sdp_filename, "video.sdp");
> if(s != NULL) {
> s++;
> if(s[0] != '\0') {
> snprintf(sdp_filename, namelen, "%s.sdp", s);
> }
> }
> }
>
>
> /* scan sdp file for media control attribute */
> static void get_media_control_attribute(const char *sdp_filename,
> char *control)
> {
> int max_len = 256;
> char *s = malloc(max_len);
> FILE *sdp_fp = fopen(sdp_filename, "rb");
> control[0] = '\0';
> if(sdp_fp != NULL) {
> while(fgets(s, max_len - 2, sdp_fp) != NULL) {
> sscanf(s, " a = control: %s", control);
> }
> fclose(sdp_fp);
> }
> free(s);
> }
>
>
> /* main app */
> int main(int argc, char * const argv[])
> {
> #if 1
> const char *transport = "RTP/AVP;unicast;client_port=1234-1235"; /* UDP
> */
> #else
> /* TCP */
> const char *transport = "RTP/AVP/TCP;unicast;client_port=1234-1235";
> #endif
> const char *range = "0.000-";
> int rc = EXIT_SUCCESS;
> char *base_name = NULL;
>
> printf("\nRTSP request %s\n", VERSION_STR);
> printf(" Project web site: "
> "https://github.com/BackupGGCode/rtsprequest\n");
> printf(" Requires curl V7.20 or greater\n\n");
>
> /* check command line */
> if((argc != 2) && (argc != 3)) {
> base_name = strrchr(argv[0], '/');
> if(base_name == NULL) {
> base_name = strrchr(argv[0], '\\');
> }
> if(base_name == NULL) {
> base_name = argv[0];
> }
> else {
> base_name++;
> }
> printf("Usage: %s url [transport]\n", base_name);
> printf(" url of video server\n");
> printf(" transport (optional) specifier for media stream"
> " protocol\n");
> printf(" default transport: %s\n", transport);
> printf("Example: %s rtsp://192.168.0.2/media/video1\n\n
> <http://192.168.0.2/media/video1%5Cn%5Cn>", base_name);
> rc = EXIT_FAILURE;
> }
> else {
> const char *url = argv[1];
> char *uri = malloc(strlen(url) + 32);
> char *sdp_filename = malloc(strlen(url) + 32);
> char *control = malloc(strlen(url) + 32);
> CURLcode res;
> get_sdp_filename(url, sdp_filename, strlen(url) + 32);
> if(argc == 3) {
> transport = argv[2];
> }
>
> /* initialize curl */
> res = curl_global_init(CURL_GLOBAL_ALL);
> if(res == CURLE_OK) {
> curl_version_info_data *data = curl_version_info(CURLVERSION_NOW);
> CURL *curl;
> fprintf(stderr, " curl V%s loaded\n", data->version);
>
> /* initialize this curl session */
> curl = curl_easy_init();
> if(curl != NULL) {
> my_curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);
> my_curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
> my_curl_easy_setopt(curl, CURLOPT_HEADERDATA, stdout);
> my_curl_easy_setopt(curl, CURLOPT_URL, url);
>
> /* request server options */
> snprintf(uri, strlen(url) + 32, "%s", url);
> rtsp_options(curl, uri);
>
> /* request session description and write response to sdp file */
> rtsp_describe(curl, uri, sdp_filename);
>
> /* get media control attribute from sdp file */
> get_media_control_attribute(sdp_filename, control);
>
> /* setup media stream */
> snprintf(uri, strlen(url) + 32, "%s/%s", url, control);
> rtsp_setup(curl, uri, transport);
>
> /* start playing media stream */
> snprintf(uri, strlen(url) + 32, "%s/", url);
> rtsp_play(curl, uri, range);
> printf("Playing video, press any key to stop ...");
> _getch();
> printf("\n");
>
> /* teardown session */
> rtsp_teardown(curl, uri);
>
> /* cleanup */
> curl_easy_cleanup(curl);
> curl = NULL;
> }
> else {
> fprintf(stderr, "curl_easy_init() failed\n");
> }
> curl_global_cleanup();
> }
> else {
> fprintf(stderr, "curl_global_init(%s) failed: %d\n",
> "CURL_GLOBAL_ALL", res);
> }
> free(control);
> free(sdp_filename);
> free(uri);
> }
>
> return rc;
> }
> -------------- next part --------------
> An HTML attachment was scrubbed...
> URL: <
> http://cool.haxx.se/pipermail/curl-library/attachments/20200214/2b395073/attachment-0001.html
> >
>
> ------------------------------
>
> Message: 2
> Date: Fri, 14 Feb 2020 11:14:48 +0100
> From: Dan Fandrich <dan_at_coneharvesters.com>
> To: curl-library_at_cool.haxx.se
> Subject: Re: rtsp curl code not playing video
> Message-ID: <20200214101448.GA6959_at_coneharvesters.com>
> Content-Type: text/plain; charset=iso-8859-1
>
> On Fri, Feb 14, 2020 at 02:39:16PM +0530, Nishad DESHMUKH via curl-library
> wrote:
> > after compilation and run the link video not played . my input was
>
> libcurl doesn't play video. It will happily download a bitstream containing
> video content and supply it to your application, but what that application
> does
> with that bitstream is up to it. If you want to show a video stream on an
> X11
> display, you probably want to look at something like gstreamer or another
> video
> decoding framework.
>
> Dan
>
>
> ------------------------------
>
> Subject: Digest Footer
>
> _______________________________________________
> curl-library mailing list
> curl-library_at_cool.haxx.se
> https://cool.haxx.se/cgi-bin/mailman/listinfo/curl-library
>
>
> ------------------------------
>
> End of curl-library Digest, Vol 174, Issue 10
> *********************************************
>

-------------------------------------------------------------------
Unsubscribe: https://cool.haxx.se/list/listinfo/curl-library
Etiquette: https://curl.haxx.se/mail/etiquette.html
Received on 2020-02-14