{"id":610,"date":"2020-10-24T21:43:34","date_gmt":"2020-10-24T12:43:34","guid":{"rendered":"https:\/\/blog.srytk.com\/aquei\/?p=610"},"modified":"2020-10-24T21:43:36","modified_gmt":"2020-10-24T12:43:36","slug":"%e9%9f%b3%e5%a3%b0%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92ffmpeg%e3%81%a7%e5%88%86%e5%89%b2%e3%81%99%e3%82%8b","status":"publish","type":"post","link":"https:\/\/blog.srytk.com\/aquei\/610.html","title":{"rendered":"\u97f3\u58f0\u30d5\u30a1\u30a4\u30eb\u3092ffmpeg\u3067\u5206\u5272\u3059\u308b"},"content":{"rendered":"\n<p>\u305d\u306e\u6614\u3001<a href=\"https:\/\/ja.wikipedia.org\/wiki\/%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%E3%83%97%E3%83%AC%E3%83%BC%E3%83%A4%E3%83%BC\">\u30c7\u30b8\u30bf\u30eb\u30aa\u30fc\u30c7\u30a3\u30aa\u30d7\u30ec\u30a4\u30e4\u30fc<\/a>\u3068\u3044\u3046\u3082\u306e\u304c\u5b58\u5728\u3057\u305f\u3002\u3082\u306f\u3084\u5316\u77f3\u3068\u3082\u8a00\u3048\u308b\u3053\u306e\u6a5f\u5668\u3092\u4eba\u985e\u3067\u5229\u7528\u3057\u3066\u3044\u308b\u306e\u306f\u5730\u7403\u4e0a\u3067\u3082\u6570\u308f\u305a\u304b\u3002\u305d\u3093\u306a\u8cb4\u91cd\u306a\u65e7\u4eba\u985e\u306e\u4e00\u4eba\u304c\u3053\u3053\u306b\u3044\u308b\u3002\u305d\u3046\u3001\u79c1\u3060\u3002<\/p>\n\n\n\n<p>\u4f53\u3092\u52d5\u304b\u3057\u305f\u308a\u3059\u308b\u969b\u306b\u30c7\u30b8\u30bf\u30eb\u30aa\u30fc\u30c7\u30a3\u30aa\u30d7\u30ec\u30a4\u30e4\u30fc\u3092\u4f7f\u3063\u3066\u97f3\u697d\u306f\u3082\u3061\u308d\u3093\u3001\u30e9\u30b8\u30aa\u3084\u30dd\u30c3\u30c9\u30ad\u30e3\u30b9\u30c8\u3092\u8074\u3044\u305f\u308a\u3059\u308b\u306e\u3060\u304c\u3001\u30b7\u30fc\u30af\u304c\u3068\u306b\u304b\u304f\u9762\u5012\u304f\u3055\u3044\u3002\u7269\u7406\u30dc\u30bf\u30f3\u3092\u4f7f\u3046\u306e\u3060\u304c\u6570\u79d2\u5358\u4f4d\u306a\u306e\u3067\u9577\u6642\u9593\u30b7\u30fc\u30af\u3059\u308b\u3068\u624b\u304c\u3064\u308a\u305d\u3046\u306b\u306a\u308b\u3002\u306a\u306b\u3088\u308a\u6642\u9593\u304c\u304b\u304b\u308b\u3002\u305d\u306e\u305f\u3081\u3001\u6570\u6642\u9593\u3042\u308b\u30dd\u30c3\u30c9\u30ad\u30e3\u30b9\u30c8\u306e\u9014\u4e2d\u3067\u30d7\u30ec\u30a4\u30e4\u30fc\u306e\u96fb\u6c60\u304c\u5207\u308c\u308b\u3068\u3052\u3093\u306a\u308a\u3059\u308b\u3002<\/p>\n\n\n\n<p>\u305d\u3053\u3067\u97f3\u58f0\u30d5\u30a1\u30a4\u30eb\u3092\u4e00\u5b9a\u6642\u9593\u3054\u3068\u306b\u5206\u5272\u3059\u308b\u3053\u3068\u3092\u601d\u3044\u3064\u3044\u305f\u3002\u30c8\u30e9\u30c3\u30af\u306e\u30b9\u30ad\u30c3\u30d7\u306f\u4e00\u77ac\u306a\u306e\u3067\u7279\u5b9a\u306e\u30dd\u30b8\u30b7\u30e7\u30f3\u307e\u3067\u79fb\u52d5\u3059\u308b\u306e\u306b\u6642\u9593\u304c\u304b\u304b\u3089\u306a\u3044\u3002<\/p>\n\n\n\n<p>\u5206\u5272\u306b\u306fffmpeg\u3092\u4f7f\u3046\u3053\u3068\u306b\u3057\u305f\u3002ffmpeg\u3060\u3068\u518d\u30a8\u30f3\u30b3\u30fc\u30c9\u3092\u56de\u907f\u3067\u304d\u308b\u3057(<code>-codec copy<\/code>)\u3001\u6307\u5b9a\u6642\u9593\u3060\u3051\u51fa\u529b\u5bfe\u8c61\u3068\u3059\u308b\u3053\u3068\u3082\u53ef\u80fd(<code>-t<\/code>)\u3060\u3068\u77e5\u3063\u3066\u3044\u305f\u3002\u304a\u305d\u3089\u304f\u958b\u59cb\u4f4d\u7f6e\u3092\u305a\u3089\u3059\u3053\u3068\u3082\u3067\u304d\u308b\u3060\u308d\u3046\u3068\u601d\u3063\u3066\u8abf\u3079\u308b\u3068\u3001\u3084\u3063\u3071\u308a\u51fa\u6765\u305f\u3002<a href=\"https:\/\/ffmpeg.org\/ffmpeg.html#Main-options\"><code>-ss<\/code>\u30aa\u30d7\u30b7\u30e7\u30f3\u304c\u305d\u308c\u306b\u3042\u305f\u308b<\/a>\u3002<\/p>\n\n\n\n<p>\u3064\u307e\u308a\u3001\u3042\u308b\u97f3\u58f0\u30d5\u30a1\u30a4\u30eb\u3092\u5148\u982d10\u79d2\u5f8c\u304b\u308930\u79d2\u9593\u5207\u308a\u51fa\u3059\u306b\u306f\u3053\u3046\u306a\u308b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ffmepg -ss 10 -i \/path\/to\/input -acodec copy -t 30 \/path\/to\/output<\/code><\/pre>\n\n\n\n<p>\u307e\u305f\u3001\u5206\u5272\u306b\u306f\u7dcf\u518d\u751f\u6642\u9593\u3092\u77e5\u308b\u5fc5\u8981\u304c\u3042\u308b\u304c\u3001\u305f\u3044\u3066\u3044ffmpeg\u3068\u4e00\u7dd2\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308bffprobe\u3092\u4f7f\u3063\u3066\u8abf\u3079\u308b\u3053\u3068\u304c\u3067\u304d\u308b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ffprobe -print_format json -show_format \/path\/to\/input<\/code><\/pre>\n\n\n\n<p>\u3053\u308c\u3067\u60c5\u5831\u304cjson\u5f62\u5f0f\u3067\u308f\u304b\u308b\u3002\u4fbf\u5229\uff01\u3042\u3068\u306f\u5229\u7528\u3057\u3084\u3059\u3044\u3088\u3046\u306bpython\u3067\u7c21\u5358\u306a\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u66f8\u3044\u305f\u3002<\/p>\n\n\n\n<p>python\u306e\u5b9f\u884c\u74b0\u5883\u3068ffmpeg\u304c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u3066\u30c7\u30b8\u30bf\u30eb\u30aa\u30fc\u30c7\u30a3\u30aa\u30d7\u30ec\u30a4\u30e4\u30fc\u3092\u4f7f\u3063\u3066\u3044\u308b\u4eba\u9593\u306f\u5168\u4e16\u754c\u3067\u6570\u4eba\u3057\u304b\u5c45\u306a\u3055\u305d\u3046\u3060\u304c\u3001\u305b\u3063\u304b\u304f\u306a\u306e\u3067<a href=\"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.ja\">cc0<\/a>\u3067\u516c\u958b\u3057\u3066\u304a\u304f\u3002 <code>-d<\/code>\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u5206\u5272\u3059\u308b\u79d2\u6570\u3092\u6307\u5b9a\u3059\u308b\u3002\u5206\u5272\u5f8c\u30aa\u30ea\u30b8\u30ca\u30eb\u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664\u3059\u308b\u306e\u3067\u6ce8\u610f\u304c\u5fc5\u8981\u3060\u3002<\/p>\n\n\n\n<pre><code class=\"python\">#!\/usr\/bin\/env python3\n# license: cc0 (https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.ja) \n\nfrom pathlib import Path\nimport subprocess\nimport json\nimport argparse\nimport platform\nimport time\n\nclass AudioSplitter:\n    &quot;&quot;&quot;\u97f3\u58f0\u30d5\u30a1\u30a4\u30eb\u3092\u79d2\u6570\u3067\u5206\u5272\u3059\u308b&quot;&quot;&quot;\n\n    def __init__(self, win, duration, path):\n        self.media_length = 0\n        self.win = win\n        self.duration = float(duration)\n        self.path = Path(path)\n\n        if not self.path.is_file():\n            raise Exception(&apos;file not found&apos;)\n\n    def get_media_length(self):\n        &quot;&quot;&quot;media\u306e\u518d\u751f\u6642\u9593\u3092\u53d6\u5f97\u3059\u308b&quot;&quot;&quot;\n\n        if self.media_length:\n            return self.media_length\n        else:\n            media_length = self._get_media_length()\n\n            if media_length:\n                self.media_length = media_length\n\n            return media_length\n\n    def _get_media_length(self):\n        if self.win:\n            bin = &quot;ffprobe.exe&quot;\n        else:\n            bin = &quot;ffprobe&quot;\n\n        args = [bin, &apos;-hide_banner&apos;, &apos;-print_format&apos;, &apos;json&apos;, &apos;-show_format&apos;, &apos;-loglevel&apos;, &apos;quiet&apos;, self.path]\n\n        comp = subprocess.run(args, stdout=subprocess.PIPE, check=True)\n        output = comp.stdout\n        parsed = json.loads(output)\n\n        return float(parsed[&quot;format&quot;][&quot;duration&quot;])\n\n\n    def real_split(self, duration, start, output):\n        if self.win:\n            bin = &apos;ffmpeg.exe&apos;\n        else:\n            bin = &apos;ffmpeg&apos;\n\n        args = [bin, &apos;-hide_banner&apos;, &apos;-y&apos;, &apos;-ss&apos;, str(start), &apos;-i&apos;, str(self.path), &apos;-map&apos;, &apos;0:a&apos;, &apos;-acodec&apos;, &apos;copy&apos;, &apos;-vn&apos;, &apos;-map_metadata&apos;, &apos;-1&apos;, &apos;-t&apos;, str(duration), str(output)]\n        comp = subprocess.run(args, check=True)\n\n    def split(self):\n        length = self.get_media_length()\n        current = 0\n        index = 0\n        original = self.path.name\n        duration = self.duration\n\n        while length &gt; current:\n            start = current\n            index = index + 1\n            filename = f&apos;{index}_{original}&apos;\n            output = self.path.with_name(filename)\n\n            self.real_split(self.duration, start, output)\n            current = current + duration\n\n        else:\n            self.path.unlink()\n\ndef argparser():\n    parser = argparse.ArgumentParser()\n    parser.add_argument(&apos;files&apos;, nargs=&apos;+&apos;, help=&apos;input file path&apos;)\n    parser.add_argument(&apos;-d&apos;, &apos;--duration&apos;, default=&apos;900&apos;, help=&apos;\u30d5\u30a1\u30a4\u30eb\u3042\u305f\u308a\u306e\u6700\u5927\u6642\u9593&apos;)\n    #parser.add_argument(&apos;-w&apos;, &apos;--windows&apos;, action=&apos;store_true&apos;)\n\n    args = parser.parse_args()\n\n    return args\n\n\ndef main():\n    args = argparser()\n\n    if platform.system() == &apos;Windows&apos;:\n        win = True\n    elif str(Path.cwd()).startswith(&apos;\/mnt\/c\/&apos;):\n        win = True\n    else:\n        win = False\n\n    for f in args.files:\n        audio = AudioSplitter(win=win, duration=args.duration, path=f)\n        audio.split()\n        time.sleep(1)\n\n\nif __name__ == &apos;__main__&apos;:\n    main()<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u305d\u306e\u6614\u3001\u30c7\u30b8\u30bf\u30eb\u30aa\u30fc\u30c7\u30a3\u30aa\u30d7\u30ec\u30a4\u30e4\u30fc\u3068\u3044\u3046\u3082\u306e\u304c\u5b58\u5728\u3057\u305f\u3002\u3082\u306f\u3084\u5316\u77f3\u3068\u3082\u8a00\u3048\u308b\u3053\u306e\u6a5f\u5668\u3092\u4eba\u985e\u3067\u5229\u7528\u3057\u3066\u3044\u308b\u306e\u306f\u5730\u7403\u4e0a\u3067\u3082\u6570\u308f\u305a\u304b\u3002\u305d\u3093\u306a\u8cb4\u91cd\u306a\u65e7\u4eba\u985e\u306e\u4e00\u4eba\u304c\u3053\u3053\u306b\u3044\u308b\u3002\u305d\u3046\u3001\u79c1\u3060\u3002 \u4f53\u3092\u52d5\u304b\u3057\u305f\u308a\u3059\u308b\u969b\u306b\u30c7\u30b8\u30bf\u30eb\u30aa\u30fc\u30c7\u30a3 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"local","activitypub_max_image_attachments":5,"footnotes":""},"categories":[2],"tags":[228,229],"class_list":["post-610","post","type-post","status-publish","format-standard","hentry","category-tech","tag-ffmpeg","tag-ffprobe"],"_links":{"self":[{"href":"https:\/\/blog.srytk.com\/aquei\/wp-json\/wp\/v2\/posts\/610","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.srytk.com\/aquei\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.srytk.com\/aquei\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.srytk.com\/aquei\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.srytk.com\/aquei\/wp-json\/wp\/v2\/comments?post=610"}],"version-history":[{"count":2,"href":"https:\/\/blog.srytk.com\/aquei\/wp-json\/wp\/v2\/posts\/610\/revisions"}],"predecessor-version":[{"id":612,"href":"https:\/\/blog.srytk.com\/aquei\/wp-json\/wp\/v2\/posts\/610\/revisions\/612"}],"wp:attachment":[{"href":"https:\/\/blog.srytk.com\/aquei\/wp-json\/wp\/v2\/media?parent=610"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.srytk.com\/aquei\/wp-json\/wp\/v2\/categories?post=610"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.srytk.com\/aquei\/wp-json\/wp\/v2\/tags?post=610"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}