aviocat.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /*
  2. * Copyright (c) 2012 Martin Storsjo
  3. *
  4. * This file is part of FFmpeg.
  5. *
  6. * FFmpeg is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * FFmpeg is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with FFmpeg; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include "libavutil/time.h"
  23. #include "libavformat/avformat.h"
  24. static int usage(const char *argv0, int ret)
  25. {
  26. fprintf(stderr, "%s [-b bytespersec] [-d duration] input_url output_url\n", argv0);
  27. return ret;
  28. }
  29. int main(int argc, char **argv)
  30. {
  31. int bps = 0, duration = 0, ret, i;
  32. const char *input_url = NULL, *output_url = NULL;
  33. int64_t stream_pos = 0;
  34. int64_t start_time;
  35. char errbuf[50];
  36. AVIOContext *input, *output;
  37. av_register_all();
  38. avformat_network_init();
  39. for (i = 1; i < argc; i++) {
  40. if (!strcmp(argv[i], "-b") && i + 1 < argc) {
  41. bps = atoi(argv[i + 1]);
  42. i++;
  43. } else if (!strcmp(argv[i], "-d") && i + 1 < argc) {
  44. duration = atoi(argv[i + 1]);
  45. i++;
  46. } else if (!input_url) {
  47. input_url = argv[i];
  48. } else if (!output_url) {
  49. output_url = argv[i];
  50. } else {
  51. return usage(argv[0], 1);
  52. }
  53. }
  54. if (!output_url)
  55. return usage(argv[0], 1);
  56. ret = avio_open2(&input, input_url, AVIO_FLAG_READ, NULL, NULL);
  57. if (ret) {
  58. av_strerror(ret, errbuf, sizeof(errbuf));
  59. fprintf(stderr, "Unable to open %s: %s\n", input_url, errbuf);
  60. return 1;
  61. }
  62. if (duration && !bps) {
  63. int64_t size = avio_size(input);
  64. if (size < 0) {
  65. av_strerror(ret, errbuf, sizeof(errbuf));
  66. fprintf(stderr, "Unable to get size of %s: %s\n", input_url, errbuf);
  67. goto fail;
  68. }
  69. bps = size / duration;
  70. }
  71. ret = avio_open2(&output, output_url, AVIO_FLAG_WRITE, NULL, NULL);
  72. if (ret) {
  73. av_strerror(ret, errbuf, sizeof(errbuf));
  74. fprintf(stderr, "Unable to open %s: %s\n", output_url, errbuf);
  75. goto fail;
  76. }
  77. start_time = av_gettime_relative();
  78. while (1) {
  79. uint8_t buf[1024];
  80. int n;
  81. n = avio_read(input, buf, sizeof(buf));
  82. if (n <= 0)
  83. break;
  84. avio_write(output, buf, n);
  85. stream_pos += n;
  86. if (bps) {
  87. avio_flush(output);
  88. while ((av_gettime_relative() - start_time) * bps / AV_TIME_BASE < stream_pos)
  89. av_usleep(50 * 1000);
  90. }
  91. }
  92. avio_flush(output);
  93. avio_close(output);
  94. fail:
  95. avio_close(input);
  96. avformat_network_deinit();
  97. return ret ? 1 : 0;
  98. }