Re: curl-library Digest, Vol 174, Issue 10
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